方法: サポート資格情報を作成する
カスタムのセキュリティ スキームでは、複数の資格情報が必要になることがあります。 たとえば、サービスが、ユーザー名とパスワードだけでなく、クライアントが 18 歳以上であることを証明する資格情報もクライアントに要求することがあります。 この第 2 の資格情報はサポート資格情報です。 このトピックでは、このような資格情報を Windows Communication Foundation (WCF) クライアントで実装する方法を説明します。
Note
サポート資格情報の仕様は、WS-SecurityPolicy 仕様の一部です。 詳細については、Web サービスのセキュリティ仕様に関するページを参照してください。
トークンのサポート
要するに、メッセージ セキュリティを使用すると、常にプライマリ資格情報 (X.509 証明書、Kerberos チケットなど) によってメッセージがセキュリティで保護されます。
仕様で定義されているように、セキュリティ バインディングでは、トークンを使用してメッセージ交換をセキュリティで保護します。 トークンは、セキュリティ資格情報を表したものです。
セキュリティ バインディングは、セキュリティ バインディング ポリシーで特定されたプライマリ トークンを使用して、署名を作成します。 この署名はメッセージ署名と呼ばれます。
メッセージ署名に関連付けられたトークンによって提供されるクレームを増やすために、追加のトークンを指定できます。
保証、署名、および暗号化
サポート資格情報は、メッセージ内部で送信されたサポート トークンになります。 WS-SecurityPolicy 仕様では、次の表に示すように、サポート トークンをメッセージに追加する方法が 4 つ定義されています。
目的 | 説明 |
---|---|
符号付き | サポート トークンはセキュリティ ヘッダーに追加され、メッセージ署名によって署名されます。 |
保証 | 保証トークンはメッセージ署名を行います。 |
署名および保証 | 署名付き保証トークンは、メッセージ署名から生成された ds:Signature 要素全体を署名し、それ自体がこのメッセージ署名によって署名されます。つまり、両方のトークン (メッセージ署名に使用されるトークンと署名付き保証トークン) がお互いに署名します。 |
署名および暗号化 | 暗号化された署名付きサポート トークンは、wsse:SecurityHeader に表示されたときに暗号化されている署名付きサポート トークンです。 |
サポート資格情報のプログラミング
サポート トークンを使用するサービスを作成するには、<customBinding> を作成する必要があります。 (詳細については、「方法: SecurityBindingElement を使用してカスタム バインドを作成する」を参照してください)。
カスタム バインドを作成する最初の手順は、次の 3 種類のいずれかのセキュリティ バインド要素を作成することです。
すべてのクラスは、次の 4 つの関連プロパティを備えた SecurityBindingElement から継承します。
スコープ
サポート資格情報には、次の 2 つのスコープがあります。
エンドポイント サポート トークンは、エンドポイントのすべての操作をサポートします。 つまり、サポート トークンによって表される資格情報は、エンドポイントの任意の操作が呼び出されたときにいつでも使用できます。
操作サポート トークンは、エンドポイントの特定の操作のみをサポートします。
プロパティ名に示されているように、サポート資格情報は必須またはオプションのどちらかになることができます。 つまり、サポート資格情報は必須ではありませんが、存在する場合は使用され、存在しない場合も認証は失敗しません。
手順
サポート資格情報を備えたカスタム バインドを作成するには
セキュリティ バインド要素を作成します。 次の例では、SymmetricSecurityBindingElement 認証モードで
UserNameForCertificate
を作成します。 CreateUserNameForCertificateBindingElement メソッドを使用します。サポート パラメーターを対応するプロパティ (
Endorsing
、Signed
、SignedEncrypted
、またはSignedEndorsed
) によって返される型のコレクションに追加します。 System.ServiceModel.Security.Tokens 名前空間に存在する型には、X509SecurityTokenParameters など、一般的に使用される型があります。
例
説明
SymmetricSecurityBindingElement のインスタンスを作成し、KerberosSecurityTokenParameters クラスのインスタンスを、Endorsing プロパティによって返されるコレクションに追加する例を次に示します。
コード
public static Binding CreateMultiFactorAuthenticationBinding()
{
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
// The message security binding element will be configured to require 2 tokens:
// 1) A user name/password encrypted with the service token.
// 2) A client certificate used to sign the message.
// Instantiate a binding element that will require the user name/password token
// in the message (encrypted with the server certificate).
SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();
// Create supporting token parameters for the client X.509 certificate.
X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
// Specify that the supporting token is passed in the message send by the client to the service.
clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
// Turn off derived keys.
clientX509SupportingTokenParameters.RequireDerivedKeys = false;
// Augment the binding element to require the client's X.509 certificate as an
// endorsing token in the message.
messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);
// Create a CustomBinding based on the constructed security binding element.
return new CustomBinding(messageSecurity, httpTransport);
}