Compartir a través de


Cómo: 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 con un certificado.

Para determinar el tipo de credencial de cliente

  1. 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).

  2. Abra el archivo de configuración XML. Si usa la herramienta Svcutil.exe, el nombre predeterminado del archivo es Output.config.

  3. Busque el <elemento de seguridad> con el mode atributo (<modo de seguridad =MessageOrTransport>, donde MessageOrTransport se configura en uno de los modos de seguridad.

  4. 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>.

  5. Anote el valor asignado al clientCredentialType atributo . 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

  1. Use la Herramienta de utilidad de metadatos serviceModel (Svcutil.exe) para generar código y configuración desde el servicio.

  2. Cree una instancia del cliente WCF mediante el código generado.

  3. 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 Try
    

    Puede 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.

  1. Agregue un <elemento de comportamiento> al <elemento behaviors> .

  2. Agregue un elemento <clientCredentials> al elemento <behaviors>. Asegúrese de establecer el atributo necesario name en un valor adecuado.

  3. Agregue un <elemento clientCertificate> al <elemento clientCredentials> .

  4. Establezca los siguientes atributos en los valores adecuados: storeLocation, storeName, x509FindTypey findValue, 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>
    
  5. Al configurar el cliente, especifique el comportamiento estableciendo el behaviorConfiguration atributo 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 atributo bindingConfiguration para 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