方法 : フェデレーション クライアントを作成する

Windows Communication Foundation (WCF) でのフェデレーション サービス用クライアントの作成は、主に次の 3 つの手順で構成されます。

  1. wsFederationHttpBinding elementまたは同様のカスタム バインディングを構成します。適切なバインディングの作成詳細情報、「方法 : WSFederationHttpBinding を作成する」を参照してください。または、フェデレーション サービスのメタデータ エンドポイントに対して ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を実行し、フェデレーション サービスおよび 1 つ以上のセキュリティ トークン サービスとの通信用の構成ファイルを作成します。

  2. クライアントがセキュリティ トークン サービスと対話する際のさまざまな側面を制御する IssuedTokenClientCredential のプロパティを設定します。

  3. セキュリティ トークン サービスなど、特定のエンドポイントとのセキュリティ保護された通信に必要な証明書を許可する X509CertificateRecipientClientCredential のプロパティを設定します。

ms731690.note(ja-jp,VS.100).gif注 :
クライアントが、偽装された資格情報、WSFederationHttpBinding バインディングやカスタムの発行済みトークン、および非対称キーを使用すると、CryptographicException がスローされる可能性があります。IssuedKeyType プロパティと KeyType プロパティをそれぞれ AsymmetricKey に設定すると、WSFederationHttpBinding バインディングとカスタムの発行済みトークンで非対称キーが使用されます。クライアントがメッセージを送信しようとするときに、クライアントが偽装している ID のユーザー プロファイルが存在しないと、CryptographicException がスローされます。この問題を回避するには、クライアント コンピューターにログオンした後、または LoadUserProfile を呼び出した後に、メッセージを送信します。

ここでは、これらの手順について詳しく説明します。適切なバインディングの作成詳細情報、「方法 : WSFederationHttpBinding を作成する」を参照してください。フェデレーション サービスのしくみ詳細情報、「フェデレーション」を参照してください。

フェデレーション サービスの構成を生成し、確認するには

  1. コマンド ライン パラメーターとしてサービスのメタデータ URL のアドレスを使用し、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を実行します。

  2. 生成された構成ファイルを適切なエディターで開きます。

  3. 生成されたすべての <issuer> 要素と <issuerMetadata> 要素の属性と内容を調べます。これらは、<wsFederationHttpBinding> 要素またはカスタム バインド要素の <security> 要素内にあります。予期されたドメイン名やその他のアドレス情報がアドレスに含まれていることを確認します。この情報をチェックすることは重要です。それは、クライアントがこれらのアドレスに対して認証を行い、ユーザー名とパスワードの組み合わせなどの情報を公開する可能性があるためです。アドレスが予期されたアドレスではない場合、意図しない受信者に情報が公開されるおそれがあります。

  4. コメント アウトされた <alternativeIssuedTokenParameters> 要素内の追加の <issuedTokenParameters> 要素をすべて調べます。Svcutil.exe ツールを使用してフェデレーション サービスの構成を生成するときに、フェデレーション サービスまたは任意の中間セキュリティ トークン サービスが、発行者アドレスを指定せずに、複数のエンドポイントを公開するセキュリティ トークン サービスのメタデータ アドレスを指定している場合、生成された構成ファイルは最初のエンドポイントを参照します。追加のエンドポイントは、コメント アウトされた <alternativeIssuedTokenParameters> 要素として構成ファイルに含まれます。

    これらの <issuedTokenParameters> のいずれかが、既に構成に存在するものよりも適切かどうかを判断します。たとえば、セキュリティ トークン サービスに対する認証を行う際は、ユーザー名とパスワードの組み合わせよりも Windows CardSpace トークンを使用する方が、クライアントにとって望ましい場合があります。

    ms731690.note(ja-jp,VS.100).gif注 :
    サービスと通信するまでに複数のセキュリティ トークン サービスをたどる必要がある場合は、中間セキュリティ トークン サービスがクライアントを不適切なセキュリティ トークン サービスにダイレクトする可能性があります。そのため、<issuedTokenParameters> 内のセキュリティ トークン サービスのエンドポイントが、予期されたセキュリティ トークン サービスであり、未確認のセキュリティ トークン サービスでないことを確認します。

コードで IssuedTokenClientCredential を構成するには

  1. 次のコード例に示すように、ClientBase クラスの ClientCredentials プロパティまたは ChannelFactory クラスから返された、ClientCredentials クラスの IssuedToken プロパティから IssuedTokenClientCredential にアクセスします。

    Dim itcc As IssuedTokenClientCredential = client.ClientCredentials.IssuedToken
    
    IssuedTokenClientCredential itcc = 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. メッセージ セキュリティやメッセージ資格情報付きトランスポート セキュリティを使用しないバインディング (たとえば、バインディングに SecurityBindingElement が存在しない場合) で CombinedEntropy 以外のキー エントロピ モードが必要な場合は、DefaultKeyEntropyMode プロパティを適切な値に設定します。エントロピモードにより、DefaultKeyEntropyMode プロパティを使用して対称キーを制御できるかどうかが決まります。この既定値は CombinedEntropy であり、この場合、クライアントとトークン発行者の両方から、実際のキーを生成する際に組み合わせるデータが提供されます。これ以外の値は ClientEntropyServerEntropy であり、それぞれクライアントまたはサーバーによってキー全体が指定されます。サーバーのデータのみを使用してキーを指定するよう、このプロパティを設定する例を次に示します。

    itcc.DefaultKeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy
    
    itcc.DefaultKeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy;
    
    ms731690.note(ja-jp,VS.100).gif注 :
    セキュリティ トークン サービスまたはサービス バインディングに SecurityBindingElement が存在する場合、IssuedTokenClientCredential で設定された DefaultKeyEntropyMode は、SecurityBindingElementKeyEntropyMode プロパティによってオーバーライドされます。

  6. IssuerChannelBehaviors プロパティによって返されるコレクションに発行者固有のエンドポイント動作を追加して、これらの動作を構成します。

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

構成で IssuedTokenClientCredential を構成するには

  1. エンドポイントの動作で、<clientCredentials> 要素の子として <issuedToken> 要素を作成します。

  2. トークン キャッシュが不要な場合は、<issuedToken> 要素の cacheIssuedTokens 属性を false に設定します。

  3. キャッシュされたトークンの制限時間を設ける必要がある場合は、<issuedToken> 要素の maxIssuedTokenCachingTime 属性を適切な値に設定します。たとえば、次のように指定します。
    <issuedToken maxIssuedTokenCachingTime='00:10:00' />

  4. 既定値以外の値にする場合は、<issuedToken> 要素の issuedTokenRenewalThresholdPercentage 属性を適切な値に設定します。次に例を示します。

    <issuedToken issuedTokenRenewalThresholdPercentage = "80" />
    
  5. メッセージ セキュリティやメッセージ資格情報付きトランスポート セキュリティを使用しないバインディングで CombinedEntropy 以外のキー エントロピ モードが必要な場合 (たとえば、バインディングに SecurityBindingElement が存在しない場合) は、必要に応じて次のように <issuedToken> 要素の defaultKeyEntropyMode 属性を ServerEntropy または ClientEntropy に設定します。

    <issuedToken defaultKeyEntropyMode = "ServerEntropy" />
    
  6. 省略可能。<issuedToken> 要素の子として <issuerChannelBehaviors> 要素を作成して、発行者固有のカスタム エンドポイント動作を構成します。動作ごとに、<issuerChannelBehaviors> 要素の子として <add> 要素を作成します。<add> 要素の issuerAddress 属性を設定して、動作の発行者アドレスを指定します。<add> 要素の behaviorConfiguration 属性を設定して、動作自体を指定します。

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

コードで X509CertificateRecipientClientCredential を構成するには

  1. ClientBase クラスまたは ChannelFactory プロパティの ClientCredentials プロパティが持つ ServiceCertificate プロパティを介して、次のように X509CertificateRecipientClientCredential にアクセスします。

    Dim rcc As X509CertificateRecipientClientCredential = _
    client.ClientCredentials.ServiceCertificate
    
    X509CertificateRecipientClientCredential rcc =
        client.ClientCredentials.ServiceCertificate;
    
  2. 特定のエンドポイントの証明書として X509Certificate2 インスタンスを使用できる場合は、ScopedCertificates プロパティによって返されるコレクションの Add メソッドを使用します。

    rcc.ScopedCertificates.Add(New Uri("https://fabrikam.com/sts"), cert)
    
    rcc.ScopedCertificates.Add(new Uri("https://fabrikam.com/sts"), cert);
    
  3. X509Certificate2 インスタンスが使用できない場合は、次の例に示すように、X509CertificateRecipientClientCredential クラスの SetScopedCertificate メソッドを使用します。

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

構成で X509CertificateRecipientClientCredential を構成するには

  1. その要素自体がエンドポイント動作の <clientCredentials> 要素の子要素である <serviceCertifcate> 要素の子として、<scopedCertificates> 要素を作成します。

  2. <scopedCertificates> 要素の子要素として <add> 要素を作成します。適切な証明書を参照するように storeLocationstoreNamex509FindTypefindValue の各属性の値を指定します。次の例に示すように、targetUri 属性を、証明書が使用されるエンドポイントのアドレスを指定する値に設定します。

    <scopedCertificates>
     <add targetUri="https://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("ChannelFactory");
    }
    // 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 DefaulyKeyEntropyMode property
    cf.Credentials.IssuedToken.DefaultKeyEntropyMode = entropyMode;
}

セキュリティ

情報の漏えいを防ぐために、Svcutil.exe ツールを使用してフェデレーション エンドポイントからのメタデータを処理するクライアントでは、生成されたセキュリティ トークン サービス アドレスが予期されたものであることを確認する必要があります。これが特に重要なのは、セキュリティ トークン サービスが複数のエンドポイントを公開する場合です。この場合、Svcutil.exe ツールは、複数のエンドポイントうちの最初のエンドポイントを使用する構成ファイルを生成しますが、このエンドポイントは、クライアントが使用する必要のあるエンドポイントと異なる場合があるためです。

LocalIssuer が必要な場合

チェーン内の 2 番目から最後までのセキュリティ トークン サービスによって発行者アドレスまたは発行者メタデータ アドレスが指定されている場合、Svcutil.exe の既定の出力では、ローカル発行者が使用されません。クライアントで常にローカル発行者を使用する場合は、この点に注意が必要です。

IssuedTokenClientCredential クラスの LocalIssuerAddressLocalIssuerBinding、および LocalIssuerChannelBehaviors プロパティの設定詳細情報、「方法 : ローカル発行者を設定する」を参照してください。

範囲指定された証明書

証明書ネゴシエーションを使用しないという一般的な理由により、任意のセキュリティ トークン サービスとの通信用のサービス証明書を指定する必要がある場合は、X509CertificateRecipientClientCredential クラスの ScopedCertificates プロパティを使用して指定できます。SetDefaultCertificate メソッドは、パラメーターとして UriX509Certificate2 を受け取ります。指定した証明書は、指定した URI のエンドポイントと通信するときに使用されます。または、SetScopedCertificate メソッドを使用して、ScopedCertificates プロパティによって返されるコレクションに証明書を追加することもできます。

ms731690.note(ja-jp,VS.100).gif注 :
特定の URI に範囲指定された証明書というクライアントの概念は、該当する URI でエンドポイントを公開するサービスへの送信呼び出しを行うアプリケーションにだけ適用されます。これは、IssuedTokenServiceCredential クラスの KnownCertificates によって返されたコレクション内のサーバーで構成された証明書など、発行済みトークンの署名に使用される証明書には適用されません。詳細については、次のトピックを参照してください。、「方法 : フェデレーション サービスで資格情報を設定する」を参照してください。

参照

処理手順

フェデレーション サンプル
方法 : WSFederationHttpBinding のセキュリティで保護されたセッションを無効にする
方法 : WSFederationHttpBinding を作成する
方法 : フェデレーション サービスで資格情報を設定する
方法 : ローカル発行者を設定する
How to: Secure Metadata Endpoints

概念

Security Considerations with Metadata