方法 : サポート資格情報を作成する

カスタムのセキュリティ スキームでは、複数の資格情報が必要になることがあります。たとえば、サービスが、ユーザー名とパスワードだけでなく、クライアントが 18 歳以上であることを証明する資格情報もクライアントに要求することがあります。この 2 番目の資格情報をサポート資格情報と呼びます。ここでは、このような資格情報を Windows Communication Foundation (WCF) クライアントで実装する方法について説明します。

ms734664.note(ja-jp,VS.100).gif注 :
サポート資格情報の仕様は、WS-SecurityPolicy 仕様の一部です。詳細については、次のトピックを参照してください。「Web サービスのセキュリティ仕様」を参照してください。

トークンのサポート

簡単に説明すると、メッセージ セキュリティを使用した場合は、常にプライマリ資格情報 (たとえば、X.509 証明書、Kerberos チケット) によってメッセージがセキュリティで保護されます。

仕様で定義されているとおり、セキュリティ バインディングは、トークンを使用してメッセージ交換をセキュリティで保護します。トークンは、セキュリティ資格情報を表したものです。

セキュリティ バインディングは、セキュリティ バインディング ポリシーで特定されたプライマリ トークンを使用して、署名を作成します。この署名をメッセージ署名と呼びます。

メッセージ署名に関連付けられたトークンによって提供されるクレームを増やすために、追加のトークンを指定できます。

保証、署名、および暗号化

サポート資格情報は、メッセージ内部で送信されたサポート トークンになります。WS-SecurityPolicy 仕様では、次の表に示すように、サポート トークンをメッセージに追加する方法が 4 つ定義されています。

目的 説明

符号付き

サポート トークンはセキュリティ ヘッダーに追加され、メッセージ署名によって署名されます。

保証

保証トークンは、メッセージ署名を行います。

署名および保証

署名付き保証トークンは、メッセージ署名から生成された ds:Signature 要素全体を署名し、それ自体がこのメッセージ署名によって署名されます。つまり、両方のトークン (メッセージ署名に使用されるトークンと署名付き保証トークン) がお互いに署名します。

署名および暗号化

暗号化された署名付きサポート トークンは、wsse:SecurityHeader に表示されたときに暗号化されている署名付きサポート トークンです。

サポート資格情報のプログラミング

サポート トークンを使用するサービスを作成するには、customBinding Elementを作成する必要があります (詳細については、次のトピックを参照してください。 方法 : SecurityBindingElement を使用してカスタム バインディングを作成する.)

カスタム バインディングを作成する最初の手順は、次の 3 種類のいずれかのセキュリティ バインド要素を作成することです。

すべてのクラスは、次の 4 つの関連プロパティを備えた SecurityBindingElement から継承します。

スコープ

サポート資格情報には、次の 2 つのスコープがあります。

  • エンドポイント サポート トークンは、エンドポイントのすべての操作をサポートします。つまり、サポート トークンによって表される資格情報は、エンドポイントの任意の操作が呼び出されたときにいつでも使用できます。

  • 操作サポート トークンは、エンドポイントの特定の操作だけをサポートします。

プロパティ名に示されているように、サポート資格情報は必須またはオプションのどちらかになることができます。つまり、サポート資格情報は必須ではありませんが、存在する場合は使用され、存在しない場合も認証は失敗しません。

手順

サポート資格情報を備えたカスタム バインディングを作成するには

  1. セキュリティ バインド要素を作成します。次の例では、UserNameForCertificate 認証モードで SymmetricSecurityBindingElement を作成します。CreateUserNameForCertificateBindingElement メソッドを使用します。

  2. サポート パラメーターを対応するプロパティ (EndorsingSignedSignedEncrypted、または 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);
}

参照

概念

方法 : SecurityBindingElement を使用してカスタム バインディングを作成する