Comparteix a través de


Cómo: Crear un enlace personalizado mediante SecurityBindingElement

Windows Communication Foundation (WCF) incluye varios enlaces proporcionados por el sistema que se pueden configurar, pero que no proporcionan flexibilidad completa al configurar todas las opciones de seguridad que admite WCF. En este tema se muestra cómo crear un enlace personalizado directamente desde elementos de enlace individuales y se resaltan algunas de las opciones de seguridad que se pueden especificar al crear dicho enlace. Para obtener más información sobre la creación de enlaces personalizados, consulte Extensión de enlaces.

Advertencia

SecurityBindingElement no admite la forma de IDuplexSessionChannel canal, que es la forma de canal predeterminada que usa el transporte TCP cuando TransferMode se establece en Buffered. Debe establecer TransferMode en Streamed para poder usar SecurityBindingElement en este escenario.

Creación de un enlace personalizado

En WCF, todos los enlaces se componen de elementos de enlace. Cada elemento de enlace deriva de la BindingElement clase . Para los enlaces estándar proporcionados por el sistema, los elementos de enlace se crean y configuran automáticamente, aunque puede personalizar algunos de los valores de propiedad.

En cambio, para crear un enlace personalizado, los elementos de enlace se crean y configuran, y se crea un CustomBinding a partir de estos elementos.

Para ello, agregue los elementos de enlace individuales a una colección representada por una instancia de clase BindingElementCollection, y después establezca la propiedad Elements de CustomBinding igual a ese objeto. Debe agregar los elementos de enlace en el orden siguiente: Flujo de transacciones, Sesión confiable, Seguridad, Dúplex compuesto, Unidireccional, Seguridad de flujo, Codificación de mensajes y Transporte. Tenga en cuenta que no todos los elementos de enlace enumerados son necesarios en todos los enlaces.

SecurityBindingElement

Tres elementos de enlace se relacionan con la seguridad de nivel de mensaje, todos los cuales derivan de la SecurityBindingElement clase . Los tres son TransportSecurityBindingElement, SymmetricSecurityBindingElementy AsymmetricSecurityBindingElement. TransportSecurityBindingElement se utiliza para proporcionar seguridad de modo mixto. Los otros dos elementos se usan cuando la capa de mensajes proporciona seguridad.

Se usan clases adicionales cuando se proporciona seguridad a nivel de transporte.

Elementos vinculantes necesarios

Hay un gran número de posibles elementos de enlace que se pueden combinar en un enlace. No todas estas combinaciones son válidas. En esta sección se describen los elementos necesarios que deben estar presentes en un enlace de seguridad.

Los enlaces de seguridad válidos dependen de muchos factores, incluidos los siguientes:

  • Modo de seguridad.

  • Protocolo de transporte.

  • Patrón de intercambio de mensajes (MEP) especificado en el contrato.

En la tabla siguiente se muestran las configuraciones válidas de pila de elementos de enlace para cada combinación de los factores anteriores. Tenga en cuenta que se trata de requisitos mínimos. Puede agregar elementos de enlace adicionales al enlace, como elementos de enlace de codificación de mensajes, elementos de enlace de transacciones y otros elementos de enlace.

Modo de seguridad Transporte Patrón de intercambio de mensajes de contrato Patrón de intercambio de mensajes de contrato Patrón de intercambio de mensajes de contrato
Datagram Request Reply Duplex
Transporte Https
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP
OneWayBindingElement
SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
Mensaje HTTP SymmetricSecurityBindingElement SymmetricSecurityBindingElement SymmetricSecurityBindingElement (modo de autenticación = SecureConversation)
ElementoDeVinculaciónDobleCompuesto (CompositeDuplexBindingElement)
OneWayBindingElement (Elemento de Vinculación Unidireccional) OneWayBindingElement
HttpTransportBindingElement HttpTransportBindingElement HttpTransportBindingElement
TCP SecurityBindingElement SecurityBindingElement SymmetricSecurityBindingElement (modo de autenticación = SecureConversation)
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
Mixto (transporte con credenciales de mensaje) Https TransportSecurityBindingElement TransportSecurityBindingElement
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP TransportSecurityBindingElement SymmetricSecurityBindingElement (modo de autenticación = SecureConversation) SymmetricSecurityBindingElement (modo de autenticación = SecureConversation)
OneWayBindingElement
SSL o elemento de enlace de seguridad de flujo en Windows SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement

Tenga en cuenta que hay muchas opciones configurables en SecurityBindingElements. Para obtener más información, vea SecurityBindingElement Authentication Modes( Modos de autenticación de SecurityBindingElement).

Para obtener más información, consulte Secure Conversations and Secure Sessions (Conversaciones seguras y sesiones seguras).

Procedimientos

Para crear un enlace personalizado que use SymmetricSecurityBindingElement

  1. Cree una instancia de la BindingElementCollection clase con el nombre outputBec.

  2. Llame al método M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true)estático , que devuelve una instancia de la SymmetricSecurityBindingElement clase .

  3. Agregue el SymmetricSecurityBindingElement a la colección (outputBec) llamando al método Add de la clase Collection<T> de BindingElement.

  4. Cree una instancia de la TextMessageEncodingBindingElement clase y agréguela a la colección (outputBec). Especifica la codificación utilizada por la vinculación.

  5. Cree un HttpTransportBindingElement y agréguelo a la colección (outputBec). Esto especifica que el enlace usa el transporte HTTP.

  6. Cree un nuevo enlace personalizado creando una instancia de la CustomBinding clase y pasando la colección outputBec al constructor.

  7. El enlace personalizado resultante comparte muchas de las mismas características que el estándar WSHttpBinding. Especifica la seguridad de nivel de mensaje y las credenciales de Windows, pero deshabilita las sesiones seguras, requiere que se especifique la credencial de servicio fuera de banda y no cifra las firmas. La última solo se puede controlar estableciendo la MessageProtectionOrder propiedad como se muestra en el paso 4. Los otros dos se pueden controlar mediante la configuración del enlace estándar.

Ejemplo

Descripción

En el ejemplo siguiente se proporciona una función completa para crear un enlace personalizado que usa un SymmetricSecurityBindingElement.

Código

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

Consulte también