방법: 페더레이션 클라이언트 만들기

WCF(Windows Communication Foundation)에서 페더레이션 서비스용 클라이언트를 만드는 것은 다음 세 가지 주요 단계로 구성됩니다.

  1. <wsFederationHttpBinding> 또는 유사한 사용자 지정 바인딩을 구성합니다. 적절한 바인딩을 만드는 방법에 대한 자세한 내용은 방법: WSFederationHttpBinding 만들기를 참조하세요. 또는 페더레이션 서비스의 메타데이터 엔드포인트에 대해 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 실행하여 페더레이션 서비스 및 하나 이상의 보안 토큰 서비스와 통신하기 위한 구성 파일을 생성합니다.

  2. 보안 토큰 서비스와 클라이언트의 상호 작용에 대한 다양한 측면을 제어하는 IssuedTokenClientCredential의 속성을 설정합니다.

  3. X509CertificateRecipientClientCredential의 속성을 설정합니다. 이 설정은 보안 토큰 서비스의 경우처럼 제공된 엔드포인트와 안전하게 통신하는 데 필요한 인증서를 허용합니다.

참고 항목

클라이언트가 가장된 자격 증명, CryptographicException 바인딩 또는 사용자 지정 발급 토큰 및 비대칭 키를 사용할 때 WSFederationHttpBinding이 throw될 수 있습니다. 비대칭 키는 WSFederationHttpBindingIssuedKeyType 속성이 각각 KeyType로 설정된 경우 AsymmetricKey 바인딩 및 사용자 지정 발급 토큰과 함께 사용됩니다. 클라이언트가 메시지를 보내려고 할 때 및 클라이언트가 가장하고 있는 ID에 대해 사용자 프로필이 없을 때 CryptographicException이 throw됩니다. 이 문제를 완화하려면 메시지를 보내기 전에 클라이언트 컴퓨터에 로그온하거나 LoadUserProfile을 호출합니다.

이 항목에서는 이러한 절차에 대해 자세히 설명합니다. 적절한 바인딩을 만드는 방법에 대한 자세한 내용은 방법: WSFederationHttpBinding 만들기를 참조하세요. 페더레이션 서비스의 작동 방식에 대한 자세한 내용은 페더레이션을 참조하세요.

페더레이션 서비스에 대한 구성을 생성하고 검사하려면

  1. 서비스의 메타데이터 URL 주소를 명령줄 매개 변수로 사용하여 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 실행합니다.

  2. 생성된 구성 파일을 적절한 편집기에서 엽니다.

  3. 생성된 <issuer><issuerMetadata> 요소의 특성과 콘텐츠를 검사합니다. 이는 <wsFederationHttpBinding> 또는 사용자 지정 바인딩 요소의 <security> 요소 내에 있습니다. 주소에 예상 도메인 이름 또는 다른 주소 정보가 포함되어 있는지 확인합니다. 클라이언트가 이러한 주소를 인증하고 사용자 이름/암호 쌍과 같은 정보를 노출할 수 있으므로 이 정보를 확인해야 합니다. 해당 주소가 예상 주소가 아닐 경우 의도하지 않은 받는 사람에게 정보가 노출될 수 있습니다.

  4. 주석 처리된 <alternativeIssuedTokenParameters> 요소 내부의 추가 <issuedTokenParameters> 요소를 검사합니다. Svcutil.exe 도구를 사용하여 페더레이션 서비스에 대한 구성을 생성할 때, 페더레이션 서비스 또는 중간 보안 토큰 서비스에서 발급자 주소를 지정하지 않고 여러 엔드포인트를 노출하는 보안 토큰 서비스에 대한 메타데이터 주소를 지정하는 경우 결과 구성 파일이 첫 번째 엔드포인트를 참조합니다. 추가 엔드포인트는 주석 처리된 <alternativeIssuedTokenParameters> 요소로 구성 파일에 있습니다.

    이러한 <issuedTokenParameters> 중 하나가 구성에 이미 있는 것보다 더 적합한지 여부를 결정합니다. 예를 들어 클라이언트가 사용자 이름/암호 쌍을 사용하지 않고 Windows CardSpace 토큰을 사용하여 보안 토큰 서비스를 인증하는 것을 선호할 수 있습니다.

    참고 항목

    서비스와 통신하기 전에 여러 보안 토큰 서비스를 이동해야 하는 경우 중간 보안 토큰 서비스가 클라이언트에 잘못된 보안 토큰 서비스를 지시할 수 있습니다. 따라서 <issuedTokenParameters>의 보안 토큰 서비스에 대한 엔드포인트가 알 수 없는 보안 토큰 서비스가 아니라 예상되는 보안 토큰 서비스인지 확인합니다.

코드에서 IssuedTokenClientCredential을 구성하려면

  1. 다음 예제 코드에서처럼 IssuedTokenClientCredential 클래스(IssuedToken 클래스의 ClientCredentials 속성 또는 ClientCredentials 클래스를 통해 반환된 클래스)의 ClientBase<TChannel> 속성을 통해 ChannelFactory에 액세스합니다.

    IssuedTokenClientCredential itcc = client.ClientCredentials.IssuedToken;
    
    Dim itcc As IssuedTokenClientCredential = client.ClientCredentials.IssuedToken
    
  2. 토큰 캐싱이 필요하지 않은 경우 CacheIssuedTokens 속성을 false로 설정합니다. CacheIssuedTokens 속성은 보안 토큰 서비스의 이러한 토큰이 캐싱되었는지 여부를 제어합니다. 이 속성이 false로 설정된 경우 클라이언트는 이전 토큰이 유효한지 여부에 관계없이 페더레이션 서비스에 자신을 다시 인증해야 할 때마다 보안 토큰 서비스로부터 새 토큰을 요청합니다. 이 속성이 true로 설정된 경우 클라이언트는 토큰이 만료되지 않는 한 페더레이션 서비스에 자신을 다시 인증해야 할 때마다 기존 토큰을 다시 사용합니다. 기본값은 true입니다.

  3. 캐싱된 토큰에서 시간 제한이 필요한 경우 MaxIssuedTokenCachingTime 속성을 TimeSpan 값으로 설정합니다. 이 속성은 토큰을 캐싱할 수 있는 기간을 지정합니다. 지정한 시간 범위가 경과되면 토큰이 클라이언트 캐시로부터 제거됩니다. 기본적으로 토큰은 무기한 캐싱됩니다. 다음 예제에서는 이 시간 범위를 10분으로 설정합니다.

    itcc.MaxIssuedTokenCachingTime = new TimeSpan(0, 10, 0);
    
    itcc.MaxIssuedTokenCachingTime = New TimeSpan(0, 10, 0)
    
  4. 선택 사항. IssuedTokenRenewalThresholdPercentage를 백분율로 설정합니다. 기본값은 60(%)입니다. 이 속성은 토큰 유효 기간의 백분율을 지정합니다. 예를 들어 발급한 토큰이 10시간 동안 유효하고 IssuedTokenRenewalThresholdPercentage가 80으로 설정된 경우 8시간 후에 토큰이 갱신됩니다. 다음 예제에서는 이 값을 80%로 설정합니다.

    itcc.IssuedTokenRenewalThresholdPercentage = 80;
    
    itcc.IssuedTokenRenewalThresholdPercentage = 80
    

    토큰 유효 기간 및 IssuedTokenRenewalThresholdPercentage 값에 따라 결정되는 갱신 간격은 캐싱 시간이 갱신 임계값 시간보다 짧은 경우에 MaxIssuedTokenCachingTime 값으로 재정의됩니다. 예를 들어 IssuedTokenRenewalThresholdPercentage와 토큰의 기간을 곱한 값이 8시간이고, MaxIssuedTokenCachingTime 값이 10분이면 클라이언트가 업데이트된 토큰에 대한 보안 토큰 서비스에 10분마다 연결합니다.

  5. 메시지 자격 증명에 메시지 보안 또는 전송 보안을 사용하지 않는 바인딩에서 CombinedEntropy 이외의 키 엔트로피 모드가 필요한 경우(예: 바인딩에 SecurityBindingElement가 없는 경우) DefaultKeyEntropyMode 속성을 적절한 값으로 설정합니다. 엔트로피 모드는 DefaultKeyEntropyMode 속성을 사용하여 대칭 키를 제어할 수 있는지 여부를 결정합니다. 이 기본값은 CombinedEntropy입니다. 이 경우, 클라이언트와 토큰 발급자 모두 결합된 데이터를 제공하여 실제 키를 생성합니다. 다른 값은 ClientEntropyServerEntropy입니다. 즉, 전체 키가 클라이언트나 서버에 의해 각각 지정됩니다. 다음 예제에서는 키에 대해 서버 데이터만 사용하도록 속성을 설정합니다.

    itcc.DefaultKeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy;
    
    itcc.DefaultKeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy
    

    참고 항목

    SecurityBindingElement가 보안 토큰 서비스 또는 서비스 바인딩에 있는 경우 DefaultKeyEntropyMode에 설정된 IssuedTokenClientCredentialKeyEntropyModeSecurityBindingElement 속성으로 재정의됩니다.

  6. 발급자 특정 엔드포인트 동작을 IssuerChannelBehaviors 속성에서 반환된 컬렉션에 추가하여 해당 동작을 구성합니다.

    itcc.LocalIssuerChannelBehaviors.Add(myEndpointBehavior);
    
    itcc.LocalIssuerChannelBehaviors.Add(myEndpointBehavior)
    

구성에서 IssuedTokenClientCredential을 구성하려면

  1. 엔드포인트 동작에서 <issuedToken> 요소의 자식 요소로 <issuedToken> 요소를 만듭니다.

  2. 토큰 캐싱이 필요하지 않은 경우 <issuedToken> 요소의 cacheIssuedTokens 특성을 false로 설정합니다.

  3. 캐시된 토큰에 시간 제한이 필요한 경우 <issuedToken> 요소의 maxIssuedTokenCachingTime 특성을 적절한 값으로 설정합니다. 예: <issuedToken maxIssuedTokenCachingTime='00:10:00' />

  4. 기본값 이외의 값을 기본 설정하는 경우 <issuedToken> 요소의 issuedTokenRenewalThresholdPercentage 특성을 적절한 값으로 설정합니다. 예를 들면 다음과 같습니다.

    <issuedToken issuedTokenRenewalThresholdPercentage = "80" />
    
  5. 메시지 자격 증명에 메시지 보안 또는 전송 보안을 사용하지 않는 바인딩에 CombinedEntropy 이외의 키 엔트로피 모드가 있는 경우(예: 바인딩에 SecurityBindingElement가 없는 경우) defaultKeyEntropyMode 요소의 <issuedToken> 특성을 필요에 따라 ServerEntropy 또는 ClientEntropy로 설정합니다.

    <issuedToken defaultKeyEntropyMode = "ServerEntropy" />
    
  6. 선택 사항. <issuerChannelBehaviors> 요소를 <issuedToken> 요소의 자식 요소로 만들어 발급자별 사용자 지정 엔드포인트 동작을 구성합니다. 각 동작에 대해 <add> 요소를 <issuerChannelBehaviors> 요소의 자식 요소로 만듭니다. <add> 요소에서 issuerAddress 특성을 설정하여 동작의 발급자 주소를 지정합니다. <add> 요소에서 behaviorConfiguration 특성을 설정하여 동작 자체를 지정합니다.

    <issuerChannelBehaviors>
    <add issuerAddress="http://fabrikam.org/sts" behaviorConfiguration="FabrikamSTS" />
    </issuerChannelBehaviors>
    

코드에 X509CertificateRecipientClientCredential을 구성하려면

  1. X509CertificateRecipientClientCredential 속성 또는 ServiceCertificate 클래스 ClientCredentials 속성의 ClientBase<TChannel> 속성을 통해 ChannelFactory에 액세스합니다.

    X509CertificateRecipientClientCredential rcc =
        client.ClientCredentials.ServiceCertificate;
    
    Dim rcc As X509CertificateRecipientClientCredential = _
    client.ClientCredentials.ServiceCertificate
    
  2. ph x="1" /> 인스턴스를 제공된 엔드포인트의 인증서에 사용할 수 있는 경우 Add 속성에서 반환된 컬렉션의 ScopedCertificates 메서드를 사용합니다.

    rcc.ScopedCertificates.Add(new Uri("http://fabrikam.com/sts"), cert);
    
    rcc.ScopedCertificates.Add(New Uri("http://fabrikam.com/sts"), cert)
    
  3. X509Certificate2 인스턴스를 사용할 수 없는 경우 다음 예제에서처럼 SetScopedCertificate 클래스의 X509CertificateRecipientClientCredential 메서드를 사용합니다.

    public void snippet20(CalculatorClient client)
    {
        X509CertificateRecipientClientCredential rcc = client.ClientCredentials.ServiceCertificate;
        rcc.SetScopedCertificate(StoreLocation.CurrentUser,
                                 StoreName.TrustedPeople,
                                 X509FindType.FindBySubjectName,
                                 "FabrikamSTS",
                                 new Uri("http://fabrikam.com/sts"));
    }
    
    rcc.SetScopedCertificate(StoreLocation.CurrentUser, _
                StoreName.TrustedPeople, _
                X509FindType.FindBySubjectName, _
                "FabrikamSTS", _
                New Uri("http://fabrikam.com/sts"))
    

구성에서 X509CertificateRecipientClientCredential을 구성하려면

  1. 자체가 엔드포인트 동작에서 <clientCredentials> 요소의 자식인 <serviceCertificate> 요소의 자식으로 <scopedCertificates> 요소를 만듭니다.

  2. <add> 요소를 <scopedCertificates> 요소의 자식으로 만듭니다. 적합한 인증서를 참조하도록 storeLocation, storeName, x509FindTypefindValue 특성에 대한 값을 지정합니다. 다음 예제에서처럼 인증서를 사용할 엔드포인트의 주소를 제공하는 값으로 targetUri 특성을 설정합니다.

    <scopedCertificates>
     <add targetUri="http://fabrikam.com/sts"
          storeLocation="CurrentUser"
          storeName="TrustedPeople"
          x509FindType="FindBySubjectName"
          findValue="FabrikamSTS" />
    </scopedCertificates>
    

예시

다음 코드 샘플에서는 코드에 IssuedTokenClientCredential 클래스의 인스턴스를 구성합니다.

// This method configures the IssuedToken property of the Credentials property of a proxy/channel factory
public static void ConfigureIssuedTokenClientCredentials(ChannelFactory cf, bool cacheTokens,
                                                          TimeSpan tokenCacheTime, int renewalPercentage,
                                                          SecurityKeyEntropyMode entropyMode
                                                          )
{
    if (cf == null)
    {
        throw new ArgumentNullException("cf");
    }
    // Set the CacheIssuedTokens property
    cf.Credentials.IssuedToken.CacheIssuedTokens = cacheTokens;

    // Set the MaxIssuedTokenCachingTime property
    cf.Credentials.IssuedToken.MaxIssuedTokenCachingTime = tokenCacheTime;

    // Set the IssuedTokenRenewalThresholdPercentage property
    cf.Credentials.IssuedToken.IssuedTokenRenewalThresholdPercentage = renewalPercentage;

    // Set the DefaultKeyEntropyMode property
    cf.Credentials.IssuedToken.DefaultKeyEntropyMode = entropyMode;
}

' This method configures the IssuedToken property of the Credentials property of a proxy/channel factory
Public Shared Sub ConfigureIssuedTokenClientCredentials(ByVal cf As ChannelFactory, _
                                                        ByVal cacheTokens As Boolean, _
                                                        ByVal tokenCacheTime As TimeSpan, _
                                                        ByVal renewalPercentage As Integer, _
                                                        ByVal entropyMode As SecurityKeyEntropyMode)
    If cf Is Nothing Then
        Throw New ArgumentNullException("ChannelFactory")
    End If
    ' Set the CacheIssuedTokens property
    With cf.Credentials.IssuedToken
        .CacheIssuedTokens = cacheTokens

        ' Set the MaxIssuedTokenCachingTime property
        .MaxIssuedTokenCachingTime = tokenCacheTime

        ' Set the IssuedTokenRenewalThresholdPercentage property
        .IssuedTokenRenewalThresholdPercentage = renewalPercentage

        ' Set the DefaultKeyEntropyMode property
        .DefaultKeyEntropyMode = entropyMode
    End With
End Sub

.NET Framework 보안

가능한 정보 노출을 방지하려면 Svcutil.exe 도구를 실행하여 페더레이션 엔드포인트에서 메타데이터를 처리하는 클라이언트는 결과 보안 토큰 서비스 주소가 예상한 주소인지 확인해야 합니다. 이러한 확인은 보안 토큰 서비스가 여러 엔드포인트를 노출할 때 특히 중요합니다. 왜냐하면 Svcutil.exe 도구에서는 결과 구성 파일을 생성하여 이와 같은 첫 번째 엔드포인트를 사용하지만 이 엔드포인트가 클라이언트가 사용해야 하는 것이 아닐 수도 있기 때문입니다.

필수 LocalIssuer

클라이언트가 항상 로컬 발급자를 사용해야 하는 경우, 체인의 두 번째에서 마지막까지의 보안 토큰 서비스가 발급자 주소나 발급자 메타데이터 주소를 지정하면 Svcutil.exe의 기본 출력으로 인해 로컬 발급자가 사용되지 않는다는 사실을 알아야 합니다.

IssuedTokenClientCredential 클래스의 LocalIssuerAddress, LocalIssuerBindingLocalIssuerChannelBehaviors 속성 설정에 대한 자세한 내용은 방법: 로컬 발급자 구성을 참조하세요.

범위가 지정된 인증서

보안 토큰 서비스와 통신할 서비스 인증서를 지정해야 하는 경우 일반적으로 인증서 협상이 사용되지 않으므로 ScopedCertificates 클래스의 X509CertificateRecipientClientCredential 속성을 사용하여 지정할 수 있습니다. SetDefaultCertificate 메서드는 UriX509Certificate2를 매개 변수로 사용합니다. 지정한 인증서는 지정한 URI에서 엔드포인트와 통신할 때 사용됩니다. 또는 SetScopedCertificate 메서드를 사용하여 ScopedCertificates 속성에서 반환된 컬렉션에 인증서를 추가할 수 있습니다.

참고 항목

제공된 URI로 범위가 지정된 인증서에 대한 클라이언트 개념은 이러한 URI에서 엔드포인트를 노출하는 서비스로 아웃바운드 호출하는 애플리케이션에만 적용됩니다. IssuedTokenServiceCredential 클래스의 KnownCertificates에서 반환되는 컬렉션의 서버에 구성된 토큰처럼 발급된 토큰에 서명할 때 사용되는 인증서에는 적용되지 않습니다. 자세한 내용은 방법: 페더레이션 서비스에서 자격 증명 구성을 참조하세요.

참고 항목