通过


如何:使用 SecurityBindingElement 创建自定义绑定

Windows Communication Foundation (WCF)包括多个系统提供的绑定,这些绑定可以配置,但在配置 WCF 支持的所有安全选项时不提供完全的灵活性。 本主题演示如何直接从单个绑定元素创建自定义绑定,并突出显示创建此类绑定时可以指定的一些安全设置。 有关创建自定义绑定的详细信息,请参阅 扩展绑定

警告

SecurityBindingElement不支持IDuplexSessionChannel通道形状,这是当TransferMode被设置为Buffered时,TCP 传输使用的默认通道形状。 必须将TransferMode设置为Streamed才能在此场景中使用SecurityBindingElement

创建自定义绑定

在 WCF 中,所有绑定都由 绑定元素组成。 每个绑定元素都派生自 BindingElement 该类。 对于标准系统提供的绑定,系统会为你创建和配置绑定元素,不过你可以自定义某些属性设置。

相比之下,要创建自定义绑定,首先创建和配置绑定元素,然后从这些绑定元素中创建一个 CustomBinding

为此,请将单个绑定元素添加到由类实例表示的 BindingElementCollection 集合中,然后设置 Elements 等于该对象的属性 CustomBinding 。 必须按以下顺序添加绑定元素:事务流、可靠会话、安全性、复合双工、单向、流安全性、消息编码和传输。 请注意,并非所有列出的绑定元素都需要在每个绑定中。

SecurityBindingElement

三个绑定元素与消息级别安全性相关,所有这些元素都派生自 SecurityBindingElement 该类。 这三个是 TransportSecurityBindingElementSymmetricSecurityBindingElementAsymmetricSecurityBindingElementTransportSecurityBindingElement 用于提供混合模式安全性。 当消息层提供安全性时,将使用其他两个元素。

提供传输级别安全性时,将使用其他类:

必需的绑定元素

有许多可能的绑定元素可以组合成一个绑定。 并非所有组合都是有效的。 本部分介绍安全绑定中必须存在的必需元素。

有效的安全绑定取决于许多因素,包括:

  • 安全模式。

  • 传输协议。

  • 协定中指定的消息交换模式(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 (身份验证模式 = 安全会话)
CompositeDuplexBindingElement
OneWayBindingElement OneWayBindingElement
HttpTransportBindingElement HttpTransportBindingElement HttpTransportBindingElement
Tcp SecurityBindingElement SecurityBindingElement SymmetricSecurityBindingElement (身份验证模式 = 安全会话)
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
混合(使用消息凭据传输) Https TransportSecurityBindingElement TransportSecurityBindingElement
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP TransportSecurityBindingElement SymmetricSecurityBindingElement (身份验证模式 = 安全会话) SymmetricSecurityBindingElement (身份验证模式 = 安全会话)
OneWayBindingElement
SSL 或 Windows StreamSecurityBindingElement SSL 或 Windows StreamSecurityBindingElement SSL 或 Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement

请注意,SecurityBindingElements 上有许多可配置的设置。 有关详细信息,请参阅 SecurityBindingElement 身份验证模式

有关详细信息,请参阅 安全对话和安全会话

Procedures

创建使用 SymmetricSecurityBindingElement 的自定义绑定

  1. 创建一个名为outputBecBindingElementCollection类实例。

  2. 调用静态方法 M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true),该方法返回类的 SymmetricSecurityBindingElement 实例。

  3. 通过调用BindingElement类的Collection<T>Add方法,将SymmetricSecurityBindingElement添加到集合(outputBec)。

  4. 创建类的 TextMessageEncodingBindingElement 实例并将其添加到集合(outputBec)。 这指定绑定使用的编码。

  5. 创建HttpTransportBindingElement并将其添加到集合中(outputBec)。 这指定绑定使用 HTTP 传输。

  6. 通过创建类的 CustomBinding 实例并将集合 outputBec 传递给构造函数来创建新的自定义绑定。

  7. 生成的自定义绑定与标准 WSHttpBinding共享许多相同的特征。 它指定消息级安全性和 Windows 凭据,但禁用安全会话,要求将服务凭据指定为带外,并且不加密签名。 只能通过设置 MessageProtectionOrder 属性来控制最后一个属性,如步骤 4 所示。 可以使用标准绑定上的设置来控制另外两个。

示例

说明

下面的示例提供了一个完整的函数,用于创建自定义绑定,该绑定使用 SymmetricSecurityBindingElement.

Code

// 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

另见