Procedimiento para usar 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 usando los enlaces WSHttpBinding y NetTcpBinding. Para más información sobre cómo establecer el modo de seguridad, consulte Cómo establecer el modo de seguridad.
Al establecer el modo de seguridad en 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 más información, consulte Procedimiento para configurar un puerto con un certificado SSL.
Cree una instancia de la clase WSHttpBinding y establezca la propiedad Mode en TransportWithMessageCredential.
Establezca la propiedad ClientCredentialType en un valor apropiado. (Para más información, consulte Selección de un tipo de credencial). El código siguiente 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.
WSHttpBinding b = new WSHttpBinding(); b.Security.Mode = SecurityMode.TransportWithMessageCredential; b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool. Uri httpsAddress = new Uri("https://localMachineName:8006/base"); ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress); sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator"); sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
Dim b As New WSHttpBinding() b.Security.Mode = SecurityMode.TransportWithMessageCredential b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool. Dim httpsAddress As New Uri("https://localMachineName:8006/base") Dim sh As New ServiceHost(GetType(Calculator), httpsAddress) sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator") sh.Open() Console.WriteLine("Listening") Console.ReadLine()
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 en 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, como se muestra en el siguiente código.
NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential); b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; Uri netTcpAddress = new Uri("net.tcp://baseAddress"); ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress); sh.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com"); sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator"); sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential) b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate Dim netTcpAddress As New Uri("net.tcp://baseAddress") Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress) sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com") sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator") sh.Open() Console.WriteLine("Listening") Console.ReadLine()
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.
NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential); b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows; b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; Uri netTcpAddress = new Uri("net.tcp://Tcp"); ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress); sh.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com"); sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator"); sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential) b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate Dim netTcpAddress As New Uri("net.tcp://Tcp") Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress) sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com") sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator") sh.Open() Console.WriteLine("Listening") Console.ReadLine()
Uso de la configuración
Para usar el WSHttpBinding
Configure el equipo con un certificado SSL enlazado a un puerto. (Para más información, consulte Procedimiento para 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>
comoUserName
.<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> 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 atributomode
enTransportWithMessageCredential
.Agregue un elemento <
message>
y establezca el atributoclientCredentialType
en 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> a la sección de enlaces.
Agregue un elemento
<binding>
y establezca el atributoname
en un valor adecuado.Agregue un elemento
<security>
y establezca el atributomode
enTransportWithMessageCredential
.Agregue un elemento
<transport>
y establezca el atributoclientCredentialType
enWindows
.Agregue un elemento
<message>
y establezca el atributoclientCredentialType
en 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>