Procedimiento para especificar valores de credenciales de cliente
Con Windows Communication Foundation (WCF), el servicio puede especificar cómo se autentica un cliente en el servicio. 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 punto de conexión 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, consulte 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 <seguridad> con el atributo modo (<modo de seguridad =
MessageOrTransport
> dondeMessageOrTransport
está establecido 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 Mensaje, busque el elemento <mensaje> que está incluido en el elemento <seguridad>.
Tenga en cuenta el valor que se ha 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 supone que ha usado la herramienta de utilidad de metadatos de ServiceMode (Svcutil.exe) para devolver los metadatos (código y configuración) desde el servicio. Para obtener más información, consulte Procedimiento para crear un cliente.
Para especificar el valor de credencial de cliente en el cliente en código
Use la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para generar código y configuración desde el servicio.
Cree una instancia del cliente WCF mediante el código generado.
En la clase de cliente, establezca la propiedad ClientCredentials de la clase ClientBase<TChannel> 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. 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(); }
' 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
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 de <comportamiento> al elemento de <comportamientos>.
Agregue un elemento <clientCredentials> al elemento de <comportamientos>. Asegúrese de establecer el atributo
name
necesario en un valor adecuado.Agregue un elemento <clientCertificate> al elemento <clientCredentials>.
Establezca los atributos siguientes en los valores adecuados:
storeLocation
,storeName
,x509FindType
yfindValue
, como se muestra en el código siguiente. Para más información, consulte 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 punto de conexión es un elemento secundario del elemento <cliente>. 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>
Consulte también
- NetTcpBinding
- SetCertificate
- X509CertificateRecipientServiceCredential
- ClientBase<TChannel>
- X509CertificateInitiatorClientCredential
- 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
- Cómo crear un cliente
- <netTcpBinding>
- <security>
- <message>
- <behavior>
- <behaviors>
- <clientCertificate>
- <clientCredentials>