Windows Communication Foundation (WCF)包括多个系统提供的绑定,这些绑定可以配置,但在配置 WCF 支持的所有安全选项时不提供完全的灵活性。 本主题演示如何直接从单个绑定元素创建自定义绑定,并突出显示创建此类绑定时可以指定的一些安全设置。 有关创建自定义绑定的详细信息,请参阅 扩展绑定。
警告
SecurityBindingElement不支持IDuplexSessionChannel通道形状,这是当TransferMode被设置为Buffered时,TCP 传输使用的默认通道形状。 必须将TransferMode设置为Streamed才能在此场景中使用SecurityBindingElement。
创建自定义绑定
在 WCF 中,所有绑定都由 绑定元素组成。 每个绑定元素都派生自 BindingElement 该类。 对于标准系统提供的绑定,系统会为你创建和配置绑定元素,不过你可以自定义某些属性设置。
相比之下,要创建自定义绑定,首先创建和配置绑定元素,然后从这些绑定元素中创建一个 CustomBinding。
为此,请将单个绑定元素添加到由类实例表示的 BindingElementCollection 集合中,然后设置 Elements 等于该对象的属性 CustomBinding 。 必须按以下顺序添加绑定元素:事务流、可靠会话、安全性、复合双工、单向、流安全性、消息编码和传输。 请注意,并非所有列出的绑定元素都需要在每个绑定中。
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 (身份验证模式 = 安全会话) |
| 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 的自定义绑定
创建一个名为
outputBec的BindingElementCollection类实例。调用静态方法
M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true),该方法返回类的 SymmetricSecurityBindingElement 实例。通过调用BindingElement类的Collection<T>
Add方法,将SymmetricSecurityBindingElement添加到集合(outputBec)。创建类的 TextMessageEncodingBindingElement 实例并将其添加到集合(
outputBec)。 这指定绑定使用的编码。创建HttpTransportBindingElement并将其添加到集合中(
outputBec)。 这指定绑定使用 HTTP 传输。通过创建类的 CustomBinding 实例并将集合
outputBec传递给构造函数来创建新的自定义绑定。生成的自定义绑定与标准 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