Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 con un certificado.
Para determinar el tipo de credencial de cliente
Recupere los metadatos del punto de conexión de metadatos del servicio. Los metadatos normalmente constan de dos archivos: el código de cliente en el lenguaje de programación que prefiera (el valor predeterminado es Visual C#) y un archivo de configuración XML. Una manera de recuperar metadatos es usar la herramienta Svcutil.exe para devolver el código de cliente y la configuración del cliente. Para obtener más información, vea Recuperación de metadatos y Herramienta de utilidad de metadatos 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 de seguridad> con el
modeatributo (<modo de seguridad =MessageOrTransport>, dondeMessageOrTransportse configura en uno de los modos de seguridad.Busque el elemento secundario que coincida con el valor del modo. Por ejemplo, si el modo se establece en Message, busque el <elemento mensaje> contenido en el <elemento de seguridad>.
Anote el valor asignado al
clientCredentialTypeatributo . El valor real depende del modo que se use, transporte o mensaje.
En el código XML siguiente se muestra la configuración de un cliente mediante la seguridad de mensajes y la necesidad de 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
En este ejemplo se establece el modo de seguridad en Modo de transporte y se 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 el código y la configuración. Esto supone que ha usado la herramienta de utilidad de metadatos serviceModel (Svcutil.exe) para devolver los metadatos (código y configuración) del servicio. Para obtener más información, vea Cómo: Crear un cliente.
Para especificar el valor de la credencial del cliente en el código del cliente
Use la Herramienta de utilidad de metadatos 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 cliente, establezca la ClientCredentials propiedad de la ClientBase<TChannel> clase en un valor adecuado. En este ejemplo se establece la propiedad en un certificado X.509 mediante el SetCertificate método de la X509CertificateInitiatorClientCredential clase .
// 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 TryPuede usar cualquiera de las enumeraciones de la X509FindType clase . El nombre del firmante se usa aquí en caso de que se cambie el certificado (debido a una fecha de expiración). El uso del nombre del firmante permite que la infraestructura vuelva a buscar el certificado.
Para especificar el valor de la credencial del cliente en la configuración del cliente.
Agregue un <elemento de comportamiento> al <elemento behaviors> .
Agregue un elemento <clientCredentials> al elemento <behaviors>. Asegúrese de establecer el atributo necesario
nameen un valor adecuado.Agregue un <elemento clientCertificate> al <elemento clientCredentials> .
Establezca los siguientes atributos en los valores adecuados:
storeLocation,storeName,x509FindTypeyfindValue, como se muestra en el código siguiente. Para obtener más información sobre los certificados, 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
behaviorConfigurationatributo del<endpoint>elemento , como se muestra en el código siguiente. El elemento endpoint es un elemento secundario del <elemento cliente> . Además, especifique el nombre de la configuración de enlace estableciendo el atributobindingConfigurationpara el enlace del cliente. Si usa un archivo de configuración generado, el nombre del enlace se genera automáticamente. 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 un tipo de credencial
- Herramienta de utilidad de metadatos serviceModel (Svcutil.exe)
- Trabajar con certificados
- Cómo: Crear un cliente
- <netTcpBinding>
- <seguridad>
- <Mensaje>
- <comportamiento>
- <Comportamientos>
- <certificado de cliente>
- <clientCredentials>