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

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

  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 <seguridad> con el atributo modo (<modo de seguridad =MessageOrTransport> donde MessageOrTransport está establecido en uno de los modos de seguridad.

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

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

  1. Use la herramienta de utilidad de metadatos de 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 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

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

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

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

  4. Establezca los atributos siguientes en los valores adecuados: storeLocation, storeName, x509FindType y findValue, 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>
    
  5. 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 atributo bindingConfiguration 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