方法: WSFederationHttpBinding を作成する
Windows Communication Foundation (WCF) では、WSFederationHttpBinding クラス (構成では <wsFederationHttpBinding>) によって、フェデレーション サービスを公開するためのメカニズムが提供されます。 これはクライアントに対して認証を要求するサービスであって、認証にはセキュリティ トークン サービスが発行するセキュリティ トークンが必要となります。 このトピックでは、必要な処理をコード中に埋め込む形、あるいは構成ファイルに必要な記述を加える形で、WSFederationHttpBinding の設定をする手順を説明します。 バインディングを作成すると、エンドポイントを設定してこのバインディングを使用できるようになります。
基本的な手順の概略を以下に示します。
セキュリティ モードを選択します。 WSFederationHttpBinding には、メッセージ レベルでエンドツーエンドのセキュリティを提供する
Message
を指定できます。複数のホップやTransportWithMessageCredential
にまたがる通信であってもこれは有効です。クライアントとサービスが HTTPS 上で直接接続できる場合に、特に性能を発揮します。Note
WSFederationHttpBinding には、セキュリティ モードとして
None
を指定することもできます。 このモードは安全性が低く、デバッグ目的での使用のみを目的としています。 セキュリティ モードがNone
に設定された WSFederationHttpBinding でサービス エンドポイントが配置される場合、(ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によって) 結果的に生成されるクライアント バインディングは、セキュリティ モードがNone
の WSHttpBinding になります。WSFederationHttpBinding
の場合、システムに組み込まれている他のバインディングとは違って、クライアント資格情報の種類を選択する必要はありません。 これは、常に、発行されたトークンを資格情報として使うからです。 WCF は指定された発行者からトークンを取得し、これをサービスに提示することによりクライアント認証を行います。フェデレーション クライアントの場合、IssuerAddress プロパティの値として、セキュリティ トークン サービスの URL を指定します。 IssuerBinding としてバインディングを指定し、セキュリティ トークン サービスとの通信に使用します。
任意。 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
です。任意。 フェデレーション サービスの場合、IssuerMetadataAddress プロパティの値として、セキュリティ トークン サービスのメタデータ URL を指定します。 メタデータ エンドポイントは、サービスがメタデータを公開するよう設定されている場合に、クライアントが適切なバインディング/エンドポイントのペアを選択するために必要です。 メタデータの公開に関する詳細については、「メタデータの公開」を参照してください。
他に設定できるプロパティとしては、発行されたトークンの証明キーとして使用するキーの種類、クライアント/サーバー間で使用するアルゴリズム スイート、サービス資格情報をネゴシエートするか明示的に指定するか、トークンに入っていればそれに応じてサービス側で処理できるクレームの種類、クライアントがセキュリティ トークン サービスに送信する要求に追加しなければならない他の XML 要素などがあります。
Note
NegotiateServiceCredential
プロパティが意味をなすのは、SecurityMode
の設定値が Message
である場合に限ります。 SecurityMode
の設定値が TransportWithMessageCredential
であれば、NegotiateServiceCredential
プロパティは無視されます。
必要な処理をコード中に埋め込む形で WSFederationHttpBinding を設定するには
WSFederationHttpBinding のインスタンスを作成します。
必要に応じて、Mode プロパティを WSFederationHttpSecurityMode または Message に設定します。 Basic256 以外のアルゴリズム スイートが必要であれば、AlgorithmSuite プロパティを、SecurityAlgorithmSuite からの値に設定します。
NegotiateServiceCredential プロパティに適切な値を設定します。
必要であれば、IssuedKeyType プロパティを SecurityKeyType
SymmetricKey
または にAsymmetricKey
に設定します。IssuedTokenType プロパティに適切な値を設定します。 値が設定されていない場合、WCF の既定値は
http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1
になります。これは SAML 1.1 トークンを示します。クライアント側ではローカル発行者が指定されていなければ必須。サービス側では省略可能。 セキュリティ トークン サービスのアドレスと ID 情報が設定された EndpointAddress を作成し、この EndpointAddress インスタンスを IssuerAddress プロパティに代入します。
クライアント側ではローカル発行者が指定されていなければ必須。サービス側では不要。
SecurityTokenService
の Binding を作成し、Binding インスタンスを IssuerBinding プロパティに代入します。クライアント側では不要。サービス側では省略可能。 セキュリティ トークン サービスのメタデータ用の EndpointAddress インスタンスを作成し、
IssuerMetadataAddress
プロパティに代入します。クライアント側、サービス側とも省略可能。 必要な数の ClaimTypeRequirement インスタンスを生成し、ClaimTypeRequirements プロパティで返されたコレクションに追加します。
クライアント側、サービス側とも省略可能。 必要な数の XmlElement インスタンスを生成し、TokenRequestParameters プロパティで返されたコレクションに追加します。
構成ファイルに必要な記述を加える形でフェデレーション エンドポイントを作成するには
アプリケーション構成ファイルに、<bindings> 要素の子として <wsFederationHttpBinding> を作成します。
<wsFederationHttpBinding> の子として <binding> 要素を作成し、
name
属性を適切な値に設定します。<binding> 要素の子として
<security>
要素を作成します。必要に応じて、
mode
要素の<security>
属性値にMessage
またはTransportWithMessageCredential
を設定します。<message>
要素の子要素として<security>
要素を作成します。任意。
algorithmSuite
要素の<message>
属性に適切な値を設定します。 既定値は、Basic256
です。省略可能。 非対称証明キーが必要ならば、
issuedKeyType
要素の<message>
属性をAsymmetricKey
に設定します。 既定値は、SymmetricKey
です。省略可能。
issuedTokenType
要素の<message>
属性を設定します。クライアント側ではローカル発行者が指定されていなければ必須。サービス側では省略可能。
<issuer>
要素の子要素として<message>
要素を作成します。address
要素に<issuer>
属性を設定し、セキュリティ トークン サービスがトークン要求を受け付けるアドレスを指定します。任意。
<identity>
子要素を追加し、セキュリティ トークン サービスの識別子を指定します。詳細については、「サービス ID と認証」を参照してください。
クライアント側ではローカル発行者が指定されていなければ必須。サービス側では不要。 bindings セクションに、セキュリティ トークン サービスとの通信に使用できる <binding> 要素を作成します。 バインディングの作成の詳細については、「方法: 構成でサービス バインディングを指定する」を参照してください。
binding
要素のbindingConfiguration
属性および<issuer>
属性に設定して、前の手順で作成したバインディングを指定します。クライアント側では不要。サービス側では省略可能。
<message>
要素の子として<issuerMetadata>
要素を作成します。 次に、address
要素の<issuerMetadata>
属性に、セキュリティ トークン サービスがメタデータを公開するアドレスを指定します。 オプションで、<identity>
子要素を追加し、セキュリティ トークン サービスの識別子を指定します。クライアント側、サービス側とも省略可能。
<claimTypeRequirements>
要素の子要素として<message>
要素を追加します。<claimTypeRequirements>
要素に <add> 要素を追加し、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("http://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("http://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;
}
' This method creates a WSFederationHttpBinding.
Public Shared Function CreateWSFederationHttpBinding(ByVal isClient As Boolean) As WSFederationHttpBinding
' Create an instance of the WSFederationHttpBinding.
Dim b As New WSFederationHttpBinding()
With b.Security
' Set the security mode to Message.
.Mode = WSFederationHttpSecurityMode.Message
With .Message
' Set the Algorithm Suite to Basic256Rsa15.
.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15
' Set NegotiateServiceCredential to true.
.NegotiateServiceCredential = True
' Set IssuedKeyType to Symmetric.
.IssuedKeyType = SecurityKeyType.SymmetricKey
' Set IssuedTokenType to SAML 1.1
.IssuedTokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1"
End With
End With
' Extract the STS certificate from the certificate store.
Dim store As New X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser)
store.Open(OpenFlags.ReadOnly)
Dim certs = store.Certificates.Find(X509FindType.FindByThumbprint, _
"0000000000000000000000000000000000000000", _
False)
store.Close()
' Create an EndpointIdentity from the STS certificate.
Dim identity = EndpointIdentity.CreateX509CertificateIdentity(certs(0))
' Set the IssuerAddress using the address of the STS and the previously created
' EndpointIdentity.
With b.Security.Message
.IssuerAddress = New EndpointAddress(New Uri("http://localhost:8000/sts/x509"), _
identity)
' Set the IssuerBinding to a WSHttpBinding loaded from configuration.
' The IssuerBinding is only used on federated clients.
If isClient Then
.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
.IssuerMetadataAddress = New EndpointAddress(New Uri("http://localhost:8001/sts/mex"), _
identity)
End If
' Create a ClaimTypeRequirement.
Dim ctr As New ClaimTypeRequirement("http://example.org/claim/c1", _
False)
' Add the ClaimTypeRequirement to ClaimTypeRequirements
.ClaimTypeRequirements.Add(ctr)
End With
' Return the created binding
Return b
End Function