Información general de la seguridad del transporte
Los mecanismos de seguridad del transporte en Windows Communication Foundation (WCF) dependen de los enlaces y el transporte que se utilicen. Por ejemplo, al utilizar la clase WSHttpBinding, el transporte es HTTP y el mecanismo principal para garantizar el transporte es Capa de sockets seguros (SSL) sobre HTTP, normalmente denominado HTTPS. En este tema se tratan los principales mecanismos de seguridad del transporte que se utilizan en los enlaces WCF proporcionados por el sistema.
Nota
Cuando se usa la seguridad SSL con .NET Framework 3.5 y versiones posteriores, un cliente WCF usa los certificados intermedios de su almacén de certificados y los certificados intermedios recibidos durante la negociación SSL para validar la cadena de certificados en el certificado del servicio. .NET Framework 3.0 solo usa los certificados intermedios instalados en el almacén de certificados local.
Advertencia
Cuando se utiliza la seguridad de transporte, puede sobrescribirse la propiedad Thread.CurrentPrincipal. Para evitar que esto ocurra, establezca ServiceAuthorizationBehavior.PrincipalPermissionMode en PrincipalPermissionMode.None. ServiceAuthorizationBehavior es un comportamiento de servicio que se puede establecer en la descripción del servicio.
BasicHttpBinding
De manera predeterminada, la clase BasicHttpBinding no proporciona seguridad. Este enlace está diseñado para la interoperabilidad con proveedores de servicios Web que no implementan seguridad. Sin embargo, puede activar la seguridad definiendo la propiedad Mode en cualquier valor excepto None. Para habilitar la seguridad del transporte, defina la propiedad en Transport.
Interoperación con IIS
La clase BasicHttpBinding se utiliza principalmente para interoperar con los servicios Web existentes e Internet Information Services (IIS) hospeda muchos de esos servicios. Por consiguiente, la seguridad en el transporte para este enlace está diseñada para la interoperación perfecta con sitios de IIS. Esto se realiza definiendo el modo de seguridad en Transport y estableciendo a continuación el tipo de credencial del cliente. Los valores del tipo de la credencial se corresponden con los mecanismos de seguridad del directorio de IIS. El código siguiente muestra el modo que se ha establecido y el tipo de credencial definido en Windows. Puede utilizar esta configuración cuando el cliente y el servidor están en el mismo dominio de Windows.
BasicHttpBinding b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.Transport ;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
Dim b As BasicHttpBinding = New BasicHttpBinding()
b.Security.Mode = BasicHttpSecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
O bien, en la configuración:
<bindings>
<basicHttpBinding>
<binding name="SecurityByTransport">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Las secciones siguientes tratan otros tipos de credenciales de clientes.
Básico
Se corresponde con el método de autenticación básico de IIS. Cuando se utiliza este modo, el servidor IIS debe configurarse con cuentas de usuario de Windows y permisos de sistema de archivos NTFS adecuados. Para obtener más información sobre IIS 6.0, consulte Habilitación de la autenticación básica y configuración del nombre de dominio. Para obtener más información sobre IIS 7.0, consulte Configuración de la autenticación básica (IIS 7).
Certificado
IIS tiene una opción para exigir a los clientes que inicien sesión con un certificado. La característica también le permite a IIS asignar un certificado de cliente a una cuenta de Windows. Para obtener más información sobre IIS 6.0, consulte Habilitación de certificados de cliente en IIS 6.0. Para obtener más información sobre IIS 7.0, consulte Configuración de certificados de servidor en IIS 7.
Digest
La autenticación implícita es similar a la autenticación básica, pero proporciona la ventaja de enviar las credenciales como un hash, en lugar de como texto no cifrado. Para obtener más información sobre IIS 6.0, consulte Autenticación implícita en IIS 6.0. Para obtener más información sobre IIS 7.0, consulte Configuración de la autenticación implícita (IIS 7).
Windows
Esto se corresponde a la autenticación integrada de Windows en IIS. Cuando se establece en este valor, también se espera que el servidor exista en un dominio de Windows que utiliza el protocolo Kerberos como su controlador de dominio. Si el servidor no está en un dominio respaldado por Kerberos, o si se producen errores en el sistema Kerberos, puede utilizar el valor de NT LAN Manager (NTLM) descrito en la sección siguiente. Para obtener más información sobre IIS 6.0, consulte Autenticación de Windows integrada en IIS 6.0. Para obtener más información sobre IIS 7.0, consulte Configuración de certificados de servidor en IIS 7.
NTLM
Esto permite al servidor usar NTLM para la autenticación si se produce un error en el protocolo Kerberos. Para obtener más información sobre cómo configurar IIS en IIS 6.0, consulte Forzar la autenticación NTLM. Para IIS 7.0, la autenticación de Windows incluye la autenticación NTLM. Para obtener más información, vea Configurar certificados de servidor en IIS 7.
WsHttpBinding
La clase WSHttpBinding está diseñada para la interoperación con servicios que implementan las especificaciones de WS-*. La seguridad de transporte para este enlace es Capa de sockets seguros (SSL) sobre HTTP o HTTPS. Para crear una aplicación WCF que utilice SSL, use IIS para hospedar la aplicación. Alternativamente, si está creando una aplicación autohospedada, utilice la herramienta HttpCfg.exe para enlazar un certificado X.509 con un puerto concreto en un equipo. El número de puerto se especifica como parte de la aplicación WCF en forma de dirección de punto de conexión. Al utilizar el modo de transporte, la dirección del extremo debe incluir el protocolo HTTPS o se producirá una excepción en el tiempo de ejecución. Para obtener más información, consulte Seguridad de transporte HTTP.
En el caso de la autenticación del cliente, defina la propiedad ClientCredentialType de la clase HttpTransportSecurity en uno de los valores de enumeración de HttpClientCredentialType. Los valores de enumeración son idénticos a los tipos de credencial de cliente para BasicHttpBinding y están diseñados para que se hospeden con servicios de IIS.
El ejemplo siguiente muestra el enlace que se va a usar con un tipo de credencial de cliente de Windows.
// The code uses a shortcut to specify the security mode to Transport.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
' The code uses a shortcut to specify the security mode to Transport.
Dim b As WSHttpBinding = New WSHttpBinding(SecurityMode.Transport)
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
WSDualHttpBinding
Este enlace solo proporciona seguridad en el nivel de mensaje pero no seguridad en el nivel de transporte.
NetTcpBinding
La clase NetTcpBinding usa TCP para el transporte del mensaje. Se proporciona seguridad para el modo de transporte al implementar Seguridad de la capa de transporte (TLS) sobre TCP. El sistema operativo proporciona la implementación de TLS.
También puede especificar el tipo de credencial del cliente estableciendo la propiedad ClientCredentialType de la clase TcpTransportSecurity en uno de los valores de la enumeración TcpClientCredentialType, tal y como se muestra en el código siguiente.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Certificate;
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Remoto
En el cliente, debe especificar un certificado mediante el método SetCertificate de la clase X509CertificateInitiatorClientCredential.
Nota
Si está utilizando la seguridad de Windows, no se requiere un certificado.
El código siguiente usa la huella digital del certificado, que lo identifica de forma única. Para más información, consulte Trabajar con certificados.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
EndpointAddress a = new EndpointAddress("net.tcp://contoso.com/TcpAddress");
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(b, a);
cf.Credentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindByThumbprint,
"0000000000000000000000000000000000000000");
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Dim a As New EndpointAddress("net.tcp://contoso.com/TcpAddress")
Dim cf As ChannelFactory(Of ICalculator) = New ChannelFactory(Of ICalculator)(b, a)
cf.Credentials.ClientCertificate.SetCertificate( _
StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindByThumbprint, _
"0000000000000000000000000000000000000000")
También puede especificar el certificado en la configuración del cliente con el elemento <clientCredentials> de la sección behaviors.
<behaviors>
<behavior>
<clientCredentials>
<clientCertificate findValue= "101010101010101010101010101010000000000"
storeLocation="LocalMachine" storeName="My"
X509FindType="FindByThumbPrint">
</clientCertificate>
</clientCredentials>
</behavior>
</behaviors>
NetNamedPipeBinding
La clase NetNamedPipeBinding está diseñada para la comunicación eficaz dentro de la máquina. Es decir, para los procesos que se ejecuten en el mismo equipo, aunque los canales de canalización con nombre se puedan crear entre dos equipos de la misma red. Este enlace solo proporciona la seguridad de nivel de transporte. Al crear aplicaciones mediante este enlace, las direcciones del punto de conexión deben incluir "net.pipe" como protocolo de la dirección del punto de conexión.
WSFederationHttpBinding
Cuando se usa seguridad de transporte, este enlace usa SSL sobre HTTP, lo que se conoce como HTTPS con un token emitido (TransportWithMessageCredential). Para obtener más información sobre las aplicaciones de federación, consulte Federación y tokens emitidos.
NetPeerTcpBinding
La clase NetPeerTcpBinding es un transporte seguro que está diseñado para la comunicación eficaz utilizando la característica de conexión de red de punto a punto. Tal y como indica el nombre de la clase y el enlace, TCP es el protocolo. Cuando el modo de seguridad se establece en Transporte, el enlace implementa TLS sobre TCP. Para obtener más información sobre la característica punto a punto, consulte Conexión de redes punto a punto.
MsmqIntegrationBinding y NetMsmqBinding
Para obtener información completa sobre la seguridad del transporte con Message Queuing (antes denominado MSMQ), consulte Protección de mensajes utilizando la seguridad de transporte.