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