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

Windows Communication Foundation (WCF) にはシステム指定のバインディングがいくつか含まれています。これらは構成できますが、WCF によってサポートされるすべてのセキュリティ オプションを構成すると、十分な柔軟性が得られません。 ここでは、個別のバインド要素からカスタム バインディングを直接作成する方法を説明し、このようなバインディングを作成する場合に指定できるセキュリティ設定のいくつかに焦点を当てます。 カスタム バインドを作成する方法の詳細については、「バインディングの拡張」を参照してください。

警告

SecurityBindingElement では、IDuplexSessionChannelTransferMode に設定されている場合に TCP トランスポートによって使用される既定のチャネル形状である Buffered チャネル形状をサポートしていません。 このシナリオで TransferMode を使用するには、StreamedSecurityBindingElement に設定する必要があります。

カスタム バインドの作成

WCF では、すべてのバインディングが複数の "バインディング要素" で構成されています。 各バインド要素は BindingElement クラスから派生します。 標準のシステム指定のバインディングの場合、バインド要素は自動的に作成および構成されます。ただし、プロパティ設定の一部はカスタマイズが可能です。

これに対し、カスタム バインドを作成する場合は、バインド要素が作成および構成され、そのバインド要素から CustomBinding が作成されます。

これを行うには、BindingElementCollection クラスのインスタンスによって表されるコレクションに個別のバインド要素を追加し、ElementsCustomBinding プロパティをそのオブジェクトと同じにします。 バインド要素は、トランザクション フロー、信頼できるセッション、セキュリティ、複合二重、一方向、ストリーム セキュリティ、メッセージ エンコーディング、トランスポートの順に追加する必要があります。 どのバインディングでも、これらすべてのバインド要素が必要になるとは限りません。

SecurityBindingElement

3 つのバインド要素がメッセージ レベルのセキュリティに関連しており、これらはすべて SecurityBindingElement クラスから派生します。 この 3 つのバインディングとは、TransportSecurityBindingElementSymmetricSecurityBindingElement、および AsymmetricSecurityBindingElement です。 TransportSecurityBindingElement は混合モード セキュリティを提供するために使用されます。 他の 2 つの要素は、メッセージ層でセキュリティを提供する場合に使用します。

トランスポート レベルのセキュリティが提供される場合は、次の追加のクラスが使用されます。

必要なバインド要素

1 つのバインディングに結合できる可能性のあるバインド要素は多数存在します。 これらの組み合わせすべてが有効なわけではありません。 ここでは、セキュリティ バインディングに存在する必要のある要素について説明します。

有効なセキュリティ バインディングは、次のような多くの要因に依存します。

  • セキュリティ モード

  • トランスポート プロトコル

  • コントラクトに指定されているメッセージ交換パターン (MEP)

前述の要因の各組み合わせに有効なバインド要素のスタックの構成を次の表に示します。 これらは最小限の要件であることに注意してください。 メッセージ エンコーディング バインド要素、トランザクション バインド要素などの追加のバインド要素をバインディングに追加することもできます。

セキュリティ モード トランスポート コントラクトのメッセージ交換パターン コントラクトのメッセージ交換パターン コントラクトのメッセージ交換パターン
Datagram Request Reply Duplex
トランスポート Https
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP
OneWayBindingElement
SSL または Windows StreamSecurityBindingElement SSL または Windows StreamSecurityBindingElement SSL または Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
メッセージ Http SymmetricSecurityBindingElement SymmetricSecurityBindingElement SymmetricSecurityBindingElement (認証モード = SecureConversation)
CompositeDuplexBindingElement
OneWayBindingElement OneWayBindingElement
HttpTransportBindingElement HttpTransportBindingElement HttpTransportBindingElement
Tcp SecurityBindingElement SecurityBindingElement SymmetricSecurityBindingElement (認証モード = SecureConversation)
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
混合 (メッセージ資格情報付きトランスポート) Https TransportSecurityBindingElement TransportSecurityBindingElement
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP TransportSecurityBindingElement SymmetricSecurityBindingElement (認証モード = SecureConversation) SymmetricSecurityBindingElement (認証モード = SecureConversation)
OneWayBindingElement
SSL または Windows StreamSecurityBindingElement SSL または Windows StreamSecurityBindingElement SSL または Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement

SecurityBindingElements には構成可能な設定が多数あることに注意してください。 詳細については、「SecurityBindingElement 認証モード」を参照してください。

詳細については、「セキュリティ保護されたメッセージ交換とセッション」を参照してください。

手順

SymmetricSecurityBindingElement を使用するカスタム バインディングを作成するには

  1. BindingElementCollection クラスのインスタンスを outputBec という名前で作成します。

  2. 静的メソッド M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true) を呼び出します。このメソッドは、SymmetricSecurityBindingElement クラスのインスタンスを返します。

  3. SymmetricSecurityBindingElement クラスの outputBecAdd メソッドを呼び出して、Collection<T> をコレクション (BindingElement) に追加します。

  4. TextMessageEncodingBindingElement クラスのインスタンスを作成し、これをコレクション (outputBec) に追加します。 これにより、バインディングによって使用されるエンコーディングが指定されます。

  5. HttpTransportBindingElement を作成し、これをコレクション (outputBec) に追加します。 これにより、バインディングが HTTP トランスポートを使用することが指定されます。

  6. CustomBinding クラスのインスタンスを作成し、コレクション outputBec をコンストラクターに渡して、新規のカスタム バインドを作成します。

  7. 作成されたカスタム バインドは、標準の WSHttpBinding と同じ特性を数多く共有しています。 カスタム バインディングではメッセージ レベルのセキュリティと Windows 資格情報が指定されていますが、セキュリティで保護されたセッションは無効になっているため、サービス資格情報が帯域外で指定される必要があり、また署名も暗号化されません。 署名の暗号化は、MessageProtectionOrder プロパティを手順 4. で示したように設定することでのみ制御できます。 他の 2 つについては、標準バインディングの設定を使用することで制御できます。

説明

次の例では、SymmetricSecurityBindingElement を使用するカスタム バインドを作成する関数全体を示します。

コード

// Create an empty CustomBinding to populate
CustomBinding binding = new CustomBinding();
// Create a SymmetricSecurityBindingElement.
SymmetricSecurityBindingElement ssbe =
    SecurityBindingElement.CreateSspiNegotiationBindingElement(true);
// Add the SymmetricSecurityBindingElement to the BindingElementCollection.
binding.Elements.Add(ssbe);
binding.Elements.Add(new TextMessageEncodingBindingElement());
binding.Elements.Add(new HttpTransportBindingElement());
return new CustomBinding(binding);
Public Shared Function CreateCustomBinding() As Binding
    ' Create an empty Custom Binding to populate, 
    Dim binding As New CustomBinding()
    ' Create a SymmetricSecurityBindingElement.
    Dim ssbe As SymmetricSecurityBindingElement
    ssbe = SecurityBindingElement.CreateSspiNegotiationBindingElement(True)
    ' Add the SymmetricSecurityBindingElement to the BindingElementCollection.
    binding.Elements.Add(ssbe)
    binding.Elements.Add(New TextMessageEncodingBindingElement())
    binding.Elements.Add(New HttpTransportBindingElement())
    Return New CustomBinding(binding)

End Function

関連項目