Cómo: Especificar los valores de credenciales de cliente
Con Windows Communication Foundation (WCF), el servicio puede especificar cómo se debe autenticar un cliente con él. Por ejemplo, un servicio puede estipular que el cliente se autentique mediante un certificado.
Para determinar el tipo de credencial de cliente
Recupere los metadatos del extremo de metadatos del servicio. Normalmente, los metadatos constan de dos archivos: el código de cliente en el lenguaje de programación elegido (el predeterminado es Visual C#), y un archivo de configuración XML. Una manera de recuperar los metadatos consiste en usar la herramienta Svcutil.exe para devolver el código y la configuración de cliente. Para obtener más información, vea Recuperación de metadatos y Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe).
Abra el archivo de configuración XML. Si usa la herramienta Svcutil.exe, el nombre predeterminado del archivo es Output.config.
Busque el elemento <security> con el atributo mode (<security mode = MessageOrTransport**>** donde MessageOrTransport se establece en uno de los modos de seguridad).
Busque el elemento secundario que coincida con el valor del modo. Por ejemplo, si se establece el modo en Message, busque el elemento <message> incluido en el elemento <security>.
Apunte el valor asignado al atributo clientCredentialType. El valor real dependerá del modo que se use, de transporte o de mensaje.
El código XML siguiente muestra la configuración de un cliente usando la seguridad de mensajes y solicitando un certificado para autenticar al cliente.
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
Ejemplo: modo de transporte TCP con certificado como credencial de cliente
Este ejemplo establece el modo de seguridad en transporte y establece el valor de credencial de cliente en un certificado X.509. Los procedimientos siguientes muestran cómo establecer el valor de credencial de cliente en el cliente en código y configuración. Esto presupone que ha utilizado Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para devolver los metadatos (código y configuración) del servicio. Para obtener más información, vea Creación de un cliente de Windows Communication Foundation.
Para especificar el valor de credencial de cliente en el cliente en código
Utilice Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para generar código y configuración del servicio.
Cree una instancia del cliente WCF utilizando el código generado.
En la clase de cliente, establezca la propiedad ClientCredentials de la clase ClientBase en un valor adecuado. Este ejemplo establece la propiedad en un certificado X.509 utilizando el método SetCertificate de la clase X509CertificateInitiatorClientCredential.
' Create a binding using Transport and a certificate. Dim b As New NetTcpBinding() b.Security.Mode = SecurityMode.Transport b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate ' Create an EndPointAddress. Dim ea As New EndpointAddress("net.tcp://localHost:8036/Calculator/MyCalculator") ' Create the client. Dim cc As New CalculatorClient(b, ea) ' Set the certificate for the client. cc.ClientCredentials.ClientCertificate.SetCertificate( _ StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com") Try cc.Open() ' Begin using the client. Console.WriteLine(cc.Divide(1001, 2)) cc.Close() Catch adExc As AddressAccessDeniedException Console.WriteLine(adExc.Message) Console.ReadLine() Catch exc As System.Exception Console.WriteLine(exc.Message) Console.ReadLine() End Try
// Create a binding using Transport and a certificate. NetTcpBinding b = new NetTcpBinding(); b.Security.Mode = SecurityMode.Transport; b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; // Create an EndPointAddress. EndpointAddress ea = new EndpointAddress( "net.tcp://localHost:8036/Calculator/MyCalculator"); // Create the client. CalculatorClient cc = new CalculatorClient(b, ea); // Set the certificate for the client. cc.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com"); try { cc.Open(); // Begin using the client. Console.WriteLine(cc.Divide(1001, 2)); cc.Close(); } catch (AddressAccessDeniedException adExc) { Console.WriteLine(adExc.Message); Console.ReadLine(); } catch (System.Exception exc) { Console.WriteLine(exc.Message); Console.ReadLine(); }
Puede utilizar cualquiera de las enumeraciones de la clase X509FindType. El nombre de sujeto se utiliza aquí en caso de que se cambie el certificado (debido a una fecha de caducidad). Utilizar el nombre de sujeto permite a la infraestructura encontrar de nuevo el certificado.
Para especificar el valor de credencial de cliente en el cliente en configuración
Agregue un elemento <behavior> of <endpointBehaviors> al elemento <behaviors>.
Agregue un elemento <clientCredentials> al elemento <behaviors>. Asegúrese de establecer el atributo
name
necesario en un valor adecuado.Agregue un elemento <clientCertificate> of <serviceCredentials> al elemento <clientCredentials>.
Establezca los atributos siguientes en los valores adecuados:
storeLocation
,storeName
,x509FindType
yfindValue
, como se muestra en el código siguiente. Para los certificados Para obtener más información sobre , vea Trabajar con certificados.<behaviors> <endpointBehaviors> <behavior name="endpointCredentialBehavior"> <clientCredentials> <clientCertificate findValue="Contoso.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors>
Al configurar el cliente, especifique el comportamiento estableciendo el atributo
behaviorConfiguration
del elemento<endpoint>
, como se muestra en el código siguiente. El elemento del extremo es un elemento secundario del elemento <client>. Especifique también el nombre de la configuración de enlace estableciendo el atributobindingConfiguration
en el enlace para el cliente. Si está utilizando un archivo de configuración generado, se genera automáticamente el nombre del enlace. En este ejemplo, el nombre es"tcpBindingWithCredential"
.<client> <endpoint name ="" address="net.tcp://contoso.com:8036/aloha" binding="netTcpBinding" bindingConfiguration="tcpBindingWithCredential" behaviorConfiguration="endpointCredentialBehavior" /> </client>
Vea también
Tareas
Creación de un cliente de Windows Communication Foundation
Referencia
NetTcpBinding
SetCertificate
X509CertificateRecipientServiceCredential
ClientBase
X509CertificateInitiatorClientCredential
Conceptos
Programación de la seguridad de WCF
Selección de tipos de credenciales
Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe)
Trabajar con certificados
Otros recursos
<netTcpBinding>
<security> of <netTcpBinding>
<message> element of <netTcpBinding>
<behavior> of <endpointBehaviors>
<behaviors>
<clientCertificate> of <serviceCredentials>
<clientCredentials>