Практическое руководство. Создание пользовательской привязки с использованием элемента SecurityBindingElement
Windows Communication Foundation (WCF) включает несколько системных привязок, которые можно настроить, но не обеспечивают полную гибкость при настройке всех параметров безопасности, поддерживаемых WCF. В этом разделе описывается создание пользовательской привязки непосредственно из отдельных элементов привязки с рассмотрением некоторых из параметров безопасности, которые могут быть заданы при создании такой привязки. Дополнительные сведения о создании пользовательских привязок см. в разделе "Расширение привязок".
Предупреждение
SecurityBindingElement не поддерживает форму канала IDuplexSessionChannel, которая по умолчанию используется формами каналов TCP-транспорта, если свойство TransferMode имеет значение Buffered. Необходимо задать свойству TransferMode значение Streamed для использования элемента SecurityBindingElement в этом сценарии.
Создание пользовательской привязки
В WCF все привязки состоят из элементов привязки. Каждый элемент привязки наследуется от класса BindingElement. В случае стандартных предоставляемых системой привязок элементы привязки уже созданы и настроены, хотя значения некоторых свойств можно изменить.
В противоположность этому при создании пользовательской привязки потребуется создать и настроить элементы привязки и создать из этих элементов объект CustomBinding.
Для этого необходимо добавить отдельные элементы привязки в коллекцию, представляемую экземпляром класса BindingElementCollection, а затем задать свойство Elements
класса CustomBinding
равным этому объекту. Добавлять элементы привязки необходимо в следующем порядке: Transaction Flow, Reliable Session, Security, Composite Duplex, One-way, Stream Security, Message Encoding и Transport. Обратите внимание, что все перечисленные элементы привязки являются обязательными для каждой привязки.
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 |
Обратите внимание, что у элементов привязки безопасности имеется ряд настраиваемых параметров. Дополнительные сведения см. в разделе "Режимы проверки подлинности SecurityBindingElement".
Дополнительные сведения см. в разделе "Безопасные беседы" и "Безопасные сеансы".
Процедуры
Создание пользовательской привязки с использованием элемента SymmetricSecurityBindingElement
Создайте экземпляр класса BindingElementCollection с именем
outputBec
.Вызовите статический метод
M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true)
, который возвращает экземпляр класса SymmetricSecurityBindingElement.Добавьте объект SymmetricSecurityBindingElement в коллекцию (
outputBec
), вызвав методAdd
класса Collection<T> класса BindingElement.Создайте экземпляр класса TextMessageEncodingBindingElement и добавьте его в коллекцию (
outputBec
). Этим задается кодирование, используемое привязкой.Создайте объект HttpTransportBindingElement и добавьте его в коллекцию (
outputBec
). Этим указывается, что привязка использует транспорт по протоколу HTTP.Создайте новую пользовательскую привязку путем создания экземпляра класса CustomBinding и передачи коллекции
outputBec
конструктору.Полученная пользовательская привязка обладает многими из характеристик стандартной привязки WSHttpBinding. Она предусматривает безопасность уровня сообщений и учетные данные Windows (однако отключает безопасные сеансы), требует внештатного задания учетных данных службы и не шифрует подписи. Последним можно управлять, только если определить свойство MessageProtectionOrder, как показано на шаге 4. Другими двумя можно управлять с помощью параметров стандартной привязки.
Пример
Description
Следующий пример кода представляет собой полноценную функцию для создания пользовательской привязки с использованием класса 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