方法 : WSFederationHttpBinding を作成する

Windows Communication Foundation (WCF) では、WSFederationHttpBinding クラス (構成の wsFederationHttpBinding element) が、フェデレーション サービスを公開するための機構を提供します。これはクライアントに対して認証を要求するサービスであって、認証にはセキュリティ トークン サービスが発行するセキュリティ トークンが必要となります。このトピックでは、必要な処理をコード中に埋め込む形、あるいは構成ファイルに必要な記述を加える形で、WSFederationHttpBinding の設定をする手順を説明します。バインディングを作成すると、エンドポイントを設定してこのバインディングを使用できるようになります。

基本的な手順の概略を以下に示します。

  1. セキュリティ モードを選択します。WSFederationHttpBinding には、メッセージ レベルでエンドツーエンドのセキュリティを提供する Message を指定できます。複数のホップや TransportWithMessageCredential にまたがる通信であってもこれは有効です。クライアントとサービスが HTTPS 上で直接接続できる場合に、特に性能を発揮します。

    Aa347982.note(ja-jp,VS.100).gif注 :
    WSFederationHttpBinding には、セキュリティ モードとして None を指定することもできます。このモードは安全性が低く、デバッグ目的での使用のみを目的としています。セキュリティ モードが NoneWSFederationHttpBinding を使用してサービス エンドポイントを配置した場合、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によって生成される WsHttpBinding のセキュリティ モードも None になります。

    WSFederationHttpBinding の場合、システムに組み込まれている他のバインディングとは違って、クライアント資格情報の種類を選択する必要はありません。これは、常に、発行されたトークンを資格情報として使うからです。WCF は指定された発行者からトークンを取得し、これをサービスに提示することによりクライアント認証を行います。

  2. フェデレーション クライアントの場合、IssuerAddress プロパティの値として、セキュリティ トークン サービスの URL を指定します。IssuerBinding としてバインディングを指定し、セキュリティ トークン サービスとの通信に使用します。

  3. 省略可能です。IssuedTokenType プロパティの値として、トークンの種類の URI (Uniform Resource Identifier) を指定します。フェデレーション サービスについては、提示されれば受理できるトークンの種類を指定します。フェデレーション クライアントについては、セキュリティ トークン サービスに要求するトークンの種類を指定します。

    トークンの種類を指定しなければ、クライアント側ではその URI なしで WS-Trust のセキュリティ トークン要求 (RTS) を生成します。また、サービス側では、クライアントが既定で SAML (Security Assertions Markup Language) 1.1 のトークンを提示して認証するものと想定します。

    SAML 1.1 トークンの URI は "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" です。

  4. 省略可能です。フェデレーション サービスの場合、IssuerMetadataAddress プロパティの値として、セキュリティ トークン サービスのメタデータ URL を指定します。メタデータ エンドポイントは、サービスがメタデータを公開するよう設定されている場合に、クライアントが適切なバインディング/エンドポイントのペアを選択するために必要です。メタデータの公開詳細情報、「メタデータの公開」を参照してください。

他に設定できるプロパティとしては、発行されたトークンの証明キーとして使用するキーの種類、クライアント/サーバー間で使用するアルゴリズム スイート、サービス資格情報をネゴシエートするか明示的に指定するか、トークンに入っていればそれに応じてサービス側で処理できるクレームの種類、クライアントがセキュリティ トークン サービスに送信する要求に追加しなければならない他の XML 要素などがあります。

Aa347982.note(ja-jp,VS.100).gif注 :
NegotiateServiceCredential プロパティが意味をなすのは、SecurityMode の設定値が Message である場合に限ります。SecurityMode の設定値が TransportWithMessageCredential であれば、NegotiateServiceCredential プロパティは無視されます。

必要な処理をコード中に埋め込む形で WSFederationHttpBinding を設定するには

  1. WSFederationHttpBinding のインスタンスを作成します。

  2. 必要に応じて、Mode プロパティを Message または TransportWithMessageCredential に設定します。Basic256 以外のアルゴリズム スイートが必要であれば、AlgorithmSuite プロパティに、列挙体 SecurityAlgorithmSuite のいずれかの値を設定します。

  3. NegotiateServiceCredential プロパティに適切な値を設定します。

  4. 必要に応じて、IssuedKeyType プロパティに SecurityKeyTypeSymmetricKey または AsymmetricKey を設定します。

  5. IssuedTokenType プロパティに適切な値を設定します。値を設定しない場合、WCF によって既定値 "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" に設定されます。これは SAML 1.1 トークンを表します。

  6. クライアント側ではローカル発行者が指定されていなければ必須。サービス側では省略可能。セキュリティ トークン サービスのアドレスと ID 情報が設定された EndpointAddress を作成し、この EndpointAddress インスタンスを IssuerAddress プロパティに代入します。

  7. クライアント側ではローカル発行者が指定されていなければ必須。サービス側では不要。SecurityTokenServiceBinding を作成し、この Binding インスタンスを IssuerBinding プロパティに代入します。

  8. クライアント側では不要。サービス側では省略可能。セキュリティ トークン サービスのメタデータ用の EndpointAddress インスタンスを作成し、IssuerMetadataAddress プロパティに代入します。

  9. クライアント側、サービス側とも省略可能。必要な数の ClaimTypeRequirement インスタンスを生成し、ClaimTypeRequirements プロパティで返されたコレクションに追加します。

  10. クライアント側、サービス側とも省略可能。必要な数の XmlElement インスタンスを生成し、TokenRequestParameters プロパティで返されたコレクションに追加します。

構成ファイルに必要な記述を加える形でフェデレーション エンドポイントを作成するには

  1. <bindings> 要素の子要素として wsFederationHttpBinding element 要素をアプリケーション構成ファイルに作成します。

  2. wsFederationHttpBinding element 要素の子要素として binding 要素を 作成し、name 属性に適切な値を設定します。

  3. binding 要素の子要素として <security> 要素を作成します。

  4. 必要に応じて、<security> 要素の mode 属性値に Message または TransportWithMessageCredential を設定します。

  5. <security> 要素の子要素として <message> 要素を作成します。

  6. 省略可能。<message> 要素の algorithmSuite 属性に適切な値を設定します。既定値は Basic256 です。

  7. 省略可能。非対称証明キーが必要ならば、<message> 要素の issuedKeyType 属性を AsymmetricKey に設定します。既定値は SymmetricKey です。

  8. 省略可能。<message> 要素の issuedTokenType 属性を設定します。

  9. クライアント側ではローカル発行者が指定されていなければ必須。サービス側では省略可能。<message> 要素の子要素として <issuer> 要素を作成します。

  10. <issuer> 要素に address 属性を設定し、セキュリティ トークン サービスがトークン要求を受け付けるアドレスを指定します。

  11. 省略可能。<identity> 子要素を追加し、セキュリティ トークン サービスの識別子を指定します。

  12. 詳細については、次のトピックを参照してください。、「サービス ID と認証」を参照してください。

  13. クライアント側ではローカル発行者が指定されていなければ必須。サービス側では不要。バインディング セクション内に、セキュリティ トークン サービスとの通信に使用可能な <binding> 要素を作成します。バインディングの作成方法詳細情報、「方法 : 構成でサービス バインディングを指定する」を参照してください。

  14. <issuer> 要素の binding 属性および bindingConfiguration 属性に設定して、前の手順で作成したバインディングを指定します。

  15. クライアント側では不要。サービス側では省略可能。<message> 要素の子要素として <issuerMetadata> 要素を作成します。次に、<issuerMetadata> 要素の address 属性に、セキュリティ トークン サービスがメタデータを公開するアドレスを指定します。オプションで、<identity> 子要素を追加し、セキュリティ トークン サービスの識別子を指定します。

  16. クライアント側、サービス側とも省略可能。<message> 要素の子要素として <claimTypeRequirements> 要素を追加します。サービスが依存する必須または省略可能なクレームを指定します。それには、<add> of <claimTypeRequirements> 要素を <claimTypeRequirements> 要素に追加し、claimType 属性でクレームの種類を指定します。さらに、isOptional 属性に、クレームが必須か省略可能かを設定します。

強制的に WSFederationHttpBinding を設定するコード例を以下に示します。

// This method creates a WSFederationHttpBinding.
public static WSFederationHttpBinding 
    CreateWSFederationHttpBinding(bool isClient)
{
  // Create an instance of the WSFederationHttpBinding.
  WSFederationHttpBinding b = new WSFederationHttpBinding();

  // Set the security mode to Message.
  b.Security.Mode = WSFederationHttpSecurityMode.Message;
  
  // Set the Algorithm Suite to Basic256Rsa15.
  b.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15;

  // Set NegotiateServiceCredential to true.
  b.Security.Message.NegotiateServiceCredential = true;

  // Set IssuedKeyType to Symmetric.
  b.Security.Message.IssuedKeyType = SecurityKeyType.SymmetricKey;

  // Set IssuedTokenType to SAML 1.1
  b.Security.Message.IssuedTokenType = 
      "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1";
        
  // Extract the STS certificate from the certificate store.
  X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
  store.Open(OpenFlags.ReadOnly);
  X509Certificate2Collection certs = store.Certificates.Find(
      X509FindType.FindByThumbprint, "0000000000000000000000000000000000000000", false);
  store.Close();
  
  // Create an EndpointIdentity from the STS certificate.
  EndpointIdentity identity = EndpointIdentity.CreateX509CertificateIdentity ( certs[0] );
  
  // Set the IssuerAddress using the address of the STS and the previously created 
  // EndpointIdentity.
  b.Security.Message.IssuerAddress = 
      new EndpointAddress(new Uri("https://localhost:8000/sts/x509"), identity);

  // Set the IssuerBinding to a WSHttpBinding loaded from configuration. 
  // The IssuerBinding is only used on federated clients.
  if (isClient)
  {
      b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer");
  }

  // Set the IssuerMetadataAddress using the metadata address of the STS and the
  // previously created EndpointIdentity. The IssuerMetadataAddress is only used 
  // on federated services.
  else
  {
      b.Security.Message.IssuerMetadataAddress =
          new EndpointAddress(new Uri("https://localhost:8001/sts/mex"), identity);
  }
  // Create a ClaimTypeRequirement.
  ClaimTypeRequirement ctr = new ClaimTypeRequirement 
      ("http://example.org/claim/c1", false);

  // Add the ClaimTypeRequirement to ClaimTypeRequirements
  b.Security.Message.ClaimTypeRequirements.Add(ctr);
  
  // Return the created binding
  return b;
}

参照

処理手順

フェデレーション サンプル
方法 : WSFederationHttpBinding のセキュリティで保護されたセッションを無効にする

概念

フェデレーション