Cómo utilizar seguridad de transporte y credenciales de mensajes
Proteger un servicio con credenciales de mensajes y transporte emplea lo mejor de los modos de seguridad de mensajes y transporte en Windows Communication Foundation (WCF). En suma, la seguridad de la capa de transporte proporciona integridad y confidencialidad, mientras que la seguridad de la capa de mensaje proporciona una variedad de credenciales que no son posibles con mecanismos de seguridad de transporte estrictos. En este tema se muestran los pasos básicos para implementar transporte con credenciales de mensaje utilizando los enlaces NetTcpBinding y WSHttpBinding. Para obtener más información acerca de establecimiento del modo de seguridad, vea Cómo: Establecer el modo de seguridad.
Al establecer el modo de seguridad como TransportWithMessageCredential, el transporte determina el mecanismo real que proporciona la seguridad de nivel de transporte. Para HTTP, el mecanismo es Secure Sockets Layer (SSL) sobre HTTP (HTTPS); para TCP, es SSL sobre TCP o Windows.
Si el transporte es HTTP (utilizando WSHttpBinding), SSL sobre HTTP proporciona la seguridad de nivel de transporte. En ese caso, debe configurar el equipo que aloja el servicio con un certificado SSL enlazado a un puerto, tal y como se muestra más adelante en este tema.
Si el transporte es TCP (utilizando NetTcpBinding), la seguridad de nivel de transporte proporcionada es, de forma predeterminada, seguridad de Windows, o SSL sobre TCP. Al utilizar SSL sobre TCP, debe especificar el certificado mediante el método SetCertificate, tal y como se muestra más adelante en este tema.
Para utilizar WSHttpBinding con un certificado para la seguridad de transporte (en código)
Utilice la herramienta HttpCfg.exe para enlazar un certificado SSL a un puerto en el equipo. Para obtener más información, consulte Cómo: Configurar un puerto con un certificado SSL.
Cree una instancia de la clase WSHttpBinding y establezca la propiedad Mode como TransportWithMessageCredential.
Establezca la propiedad ClientCredentialType con un valor apropiado. (Para obtener más información, consulte Selección de tipos de credenciales.) El siguiente código usa el valor Certificate.
Cree una instancia de la clase Uri con una dirección base apropiada. Observe que la dirección debe utilizar el esquema "HTTPS" y contener el nombre real del equipo y el número de puerto al que se enlaza el certificado SSL. (De manera alternativa, puede establecer la dirección base mediante configuración.)
Agregue un extremo de servicio mediante el método AddServiceEndpoint.
Cree la instancia del ServiceHost y llame al método Open, tal y como se muestra en el código siguiente.
Para usar el NetTcpBinding con un certificado para la seguridad de transporte (en código)
Cree una instancia de la clase NetTcpBinding y establezca la propiedad Mode como TransportWithMessageCredential.
Establezca un valor adecuado para la propiedad ClientCredentialType. El siguiente código usa el valor Certificate.
Cree una instancia de la clase Uri con una dirección base apropiada. Observe que la dirección debe utilizar el esquema "net.tcp." (De manera alternativa, puede establecer la dirección base mediante configuración.)
Cree la instancia de la clase ServiceHost.
Utilice el método SetCertificate de la clase X509CertificateRecipientServiceCredential para establecer explícitamente el certificado X.509 para el servicio.
Agregue un extremo de servicio mediante el método AddServiceEndpoint.
Llame al método Open, tal y como se indica en el siguiente código.
Para utilizar NetTcpBinding con Windows para la seguridad de transporte (en código)
Cree una instancia de la clase NetTcpBinding y establezca la propiedad Mode en TransportWithMessageCredential.
Establezca la seguridad de transporte para que utilice Windows estableciendo el ClientCredentialType como Windows. (Observe que se trata del valor predeterminado).
Establezca un valor adecuado para la propiedad ClientCredentialType. El siguiente código usa el valor Certificate.
Cree una instancia de la clase Uri con una dirección base apropiada. Observe que la dirección debe utilizar el esquema "net.tcp." (De manera alternativa, puede establecer la dirección base mediante configuración.)
Cree la instancia de la clase ServiceHost.
Utilice el método SetCertificate de la clase X509CertificateRecipientServiceCredential para establecer explícitamente el certificado X.509 para el servicio.
Agregue un extremo de servicio mediante el método AddServiceEndpoint.
Llame al método Open, como se muestra en el siguiente código.
Uso de la configuración
Para usar el WSHttpBinding
Configure el equipo con un certificado SSL enlazado a un puerto. (Para obtener más información, consulte Cómo: Configurar un puerto con un certificado SSL). No necesita establecer un valor de elemento <transport> con esta configuración.
Especifique el tipo de credencial de cliente para la seguridad del nivel de mensaje. El siguiente ejemplo establece el atributo clientCredentialType del elemento <message> como UserName.
<wsHttpBinding> <binding name="WsHttpBinding_ICalculator"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding>
Para usar el NetTcpBinding con un certificado para la seguridad de transporte
Para SSL sobre TCP, debe especificar explícitamente el certificado en el elemento <behaviors>. El siguiente ejemplo especifica un certificado por su emisor en la ubicación de almacén predeterminada (equipo local y almacenes personales).
<behaviors> <serviceBehaviors> <behavior name="mySvcBehavior"> <serviceCredentials> <serviceCertificate findValue="contoso.com" x509FindType="FindByIssuerName" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
Agregue un netTcpBinding Element a la sección de enlaces
Agregue un elemento de enlace y establezca un valor apropiado para el atributo name.
Agregue un elemento <security> y establezca el atributo mode como TransportWithMessageCredential.
Agregue un elemento <message> y establezca el atributo clientCredentialType con un valor adecuado.
<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings>
Para utilizar NetTcpBinding con Windows para la seguridad de transporte
Agregue un netTcpBinding Element a la sección de enlaces,
Agregue un elemento <binding> y establezca el atributo name con un valor adecuado.
Agregue un elemento <security> y establezca el atributo mode como TransportWithMessageCredential.
Agregue un elemento <transport> y establezca el atributo clientCredentialType como Windows.
Agregue un elemento <message> y establezca el atributo clientCredentialType con un valor adecuado. El siguiente código establece el valor para un certificado.
<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <transport clientCredentialType="Windows" /> <message clientCredentialType="Certificate" /> </security> </binding> </netTcpBinding> </bindings>
Consulte también
Tareas
Cómo: Establecer el modo de seguridad