Partilhar via


Como: Especificar valores de credenciais de cliente

Usando o Windows Communication Foundation (WCF), o serviço pode especificar como um cliente é autenticado no serviço. Por exemplo, um serviço pode estipular que o cliente seja autenticado com um certificado.

Para determinar o tipo de credencial do cliente

  1. Recupere metadados do ponto de extremidade de metadados do serviço. Os metadados geralmente consistem em dois arquivos: o código do cliente na linguagem de programação de sua escolha (o padrão é Visual C#) e um arquivo de configuração XML. Uma maneira de recuperar metadados é usar a ferramenta Svcutil.exe para retornar o código do cliente e a configuração do cliente. Para obter mais informações, consulte Recuperando metadados e ServiceModel Metadata Utility Tool (Svcutil.exe).

  2. Abra o arquivo de configuração XML. Se você usar a ferramenta Svcutil.exe, o nome padrão do arquivo é Output.config.

  3. Localize o elemento de segurança> com o atributo mode (<modo de segurança =MessageOrTransport> onde MessageOrTransport está definido como um dos modos de segurança.<

  4. Localize o elemento filho que corresponde ao valor do modo. Por exemplo, se o modo estiver definido como Mensagem, localize o <elemento de mensagem> contido no <elemento de segurança>.

  5. Observe o valor atribuído ao atributo clientCredentialType . O valor real depende de qual modo é usado, transporte ou mensagem.

O código XML a seguir mostra a configuração de um cliente usando segurança de mensagem e exigindo um certificado para autenticar o cliente.

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
        realm="" />
     <message clientCredentialType="Certificate" negotiateServiceCredential="true"
    algorithmSuite="Default" establishSecurityContext="true" />
</security>

Exemplo: Modo de Transporte TCP com Certificado como Credencial de Cliente

Este exemplo define o modo de segurança como Modo de transporte e define o valor da credencial do cliente como um certificado X.509. Os procedimentos a seguir demonstram como definir o valor da credencial do cliente no cliente em código e configuração. Isso pressupõe que você tenha usado a ServiceModel Metadata Utility Tool (Svcutil.exe) para retornar os metadados (código e configuração) do serviço. Para obter mais informações, consulte Como criar um cliente.

Para especificar o valor da credencial do cliente no código do cliente

  1. Use a ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar código e configuração do serviço.

  2. Crie uma instância do cliente WCF usando o código gerado.

  3. Na classe de cliente, defina a ClientCredentialsClientBase<TChannel> propriedade da classe como um valor apropriado. Este exemplo define a propriedade como um certificado X.509 usando o SetCertificateX509CertificateInitiatorClientCredential método da classe.

    // 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
    

    Você pode usar qualquer uma das enumerações da X509FindType classe. O nome do assunto é usado aqui no caso de o certificado ser alterado (devido a uma data de validade). O uso do nome da entidade permite que a infraestrutura encontre o certificado novamente.

Para especificar o valor da credencial do cliente no cliente na configuração

  1. Adicione um <elemento de comportamento> ao <elemento behaviors>.

  2. Adicione um elemento clientCredentials> ao <elemento behaviors>.< Certifique-se de definir o atributo necessário name para um valor apropriado.

  3. Adicione um elemento clientCertificate> ao< elemento clientCredentials>.<

  4. Defina os seguintes atributos para valores apropriados: storeLocation, storeName, x509FindTypee findValue, conforme mostrado no código a seguir. Para obter mais informações sobre certificados, consulte Trabalhando com certificados.

    <behaviors>
       <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
            <clientCredentials>
              <clientCertificate findValue="Contoso.com"
                                 storeLocation="LocalMachine"
                                 storeName="TrustedPeople"
                                 x509FindType="FindBySubjectName" />
            </clientCredentials>
          </behavior>
       </endpointBehaviors>
    </behaviors>
    
  5. Ao configurar o cliente, especifique o comportamento definindo o behaviorConfiguration<endpoint> atributo do elemento , conforme mostrado no código a seguir. O elemento endpoint é filho do elemento client>.< Além disso, especifique o nome da configuração de vinculação definindo o bindingConfiguration atributo para a associação para o cliente. Se você estiver usando um arquivo de configuração gerado, o nome da associação será gerado automaticamente. Neste exemplo, o nome é "tcpBindingWithCredential".

    <client>
      <endpoint name =""
                address="net.tcp://contoso.com:8036/aloha"
                binding="netTcpBinding"
                bindingConfiguration="tcpBindingWithCredential"
                behaviorConfiguration="endpointCredentialBehavior" />
    </client>
    

Consulte também