如何:使用 SecurityBindingElement 创建自定义绑定
Windows Communication Foundation (WCF) 包括多个系统提供的绑定,虽然这些绑定可进行配置,但在配置 WCF 支持的所有安全选项时仍显得不够灵活。本主题演示如何直接从各个绑定元素创建自定义绑定,并着重说明创建这样的绑定时可以指定的一些安全设置。有关创建自定义绑定的更多信息,请参见扩展绑定。
创建自定义绑定
在 WCF 中,所有绑定都由绑定元素**组成。每个绑定元素都是从 BindingElement 类派生的。对于系统提供的标准绑定,已为您创建和配置绑定元素,但您仍可以自定义某些属性设置。
相比之下,若要创建自定义绑定,应创建并配置绑定元素,然后从绑定元素创建 CustomBinding。
为此,将各个绑定元素添加到由 BindingElementCollection 类的实例表示的集合,然后将 CustomBinding 的 Elements 属性设置为等于该对象。必须按以下顺序添加绑定元素:事务流、可靠会话、安全、复合双工、单向、流安全、消息编码和传输。请注意,并不是每个绑定中都需要所列的所有绑定元素。
SecurityBindingElement
有三个绑定元素与消息级安全性有关,它们都派生自 SecurityBindingElement 类。这三个绑定元素是 TransportSecurityBindingElement、SymmetricSecurityBindingElement 和 AsymmetricSecurityBindingElement。TransportSecurityBindingElement 用于提供混合模式安全。当消息层提供安全时,使用其他两个元素。
在提供传输级安全时,将使用其他类:
必需的绑定元素
有大量的可能绑定元素可以组合为绑定。并非所有这些组合都是有效的。本节介绍安全绑定中必须存在的元素。
有效的安全绑定取决于多种因素,其中包括:
安全模式。
传输协议。
协定中指定的消息交换模式 (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 的自定义绑定。
以
outputBec
名称创建 BindingElementCollection 类的实例。调用静态方法 M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true),它将返回 SymmetricSecurityBindingElement 类的实例。
通过调用 BindingElement 类的 Collection 的 Add 方法,将 SymmetricSecurityBindingElement 添加到集合 (
outputBec
) 中。创建 TextMessageEncodingBindingElement 类的实例并将其添加到集合 (
outputBec
) 中。这将指定该绑定所使用的编码。创建一个 HttpTransportBindingElement 并将其添加到集合 (
outputBec
) 中。这将指定该绑定使用 HTTP 传输。通过创建 CustomBinding 类的实例并将集合
outputBec
传递给构造函数来创建一个新的自定义绑定。生成的自定义绑定具有与标准 WSHttpBinding 相同的许多特性。它指定消息级别的安全性和 Windows 凭据,但禁用安全会话,要求在带外指定服务凭据且不对签名进行加密。最后一条只能按步骤 4 所示通过设置 MessageProtectionOrder 属性来控制。其他两条可以使用标准绑定上的设置进行控制。
示例
说明
下面的示例为创建使用 SymmetricSecurityBindingElement 的自定义绑定提供了一个完整的函数。
代码
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
// 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);
另请参见
参考
SecurityBindingElement
TransportSecurityBindingElement
SymmetricSecurityBindingElement
CustomBinding