Compartilhar via


Como: especificar valores de credenciais de cliente

Usando o WCF (Windows Communication Foundation), 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 de cliente

  1. Recupere metadados do ponto de extremidade de metadados do serviço. Os metadados normalmente 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 mais informações, consulte Recuperar metadados e Ferramenta Utilitário de Metadados ServiceModel (Svcutil.exe).

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

  3. Localize o elemento de <segurança> com o atributo de modo (<modo de segurança =MessageOrTransport>, em que 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 a segurança da 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 no código e na configuração. Isso pressupõe que você tenha usado a Ferramenta Utilitário de Metadados do ServiceModel (Svcutil.exe) para retornar os metadados (código e configuração) a partir do serviço. Para obter mais informações, confira Instruções: criar um cliente.

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

  1. Use a Ferramenta Utilitário de Metadados do ServiceModel (Svcutil.exe) para gerar o código e a configuração a partir do serviço.

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

  3. Na classe cliente, defina a propriedade ClientCredentials da classe ClientBase<TChannel> como um valor apropriado. Este exemplo define a propriedade como um certificado X.509 usando o método SetCertificate da classe 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
    

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

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

  1. Adicione um elemento <behavior> ao elemento <behaviors>.

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

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

  4. Defina os seguintes atributos como valores apropriados: storeLocation, storeName, x509FindType e findValue, conforme mostrado no código a seguir. Para obter mais informações sobre certificados, consulte Working with Certificates (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 atributo behaviorConfiguration do elemento <endpoint>, conforme mostrado no código a seguir. O elemento do ponto de extremidade é um elemento filho do elemento <cliente>. Além disso, especifique o nome da configuração de associação definindo o atributo bindingConfiguration na 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>
    

Confira também