Compartilhar via


Como especificar valores de credenciais do 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 do cliente

  1. Recupere os 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 obter mais informações, consulte Recuperando metadados e a Ferramenta de Utilitário de Metadados do 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 mode atributo (<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 clientCredentialType atributo. 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 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 Ferramenta de Metadados do ServiceModel (Svcutil.exe) para gerar código e configurações do serviço.

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

  3. Na classe cliente, defina a ClientCredentials propriedade da ClientBase<TChannel> classe como um valor apropriado. Este exemplo define a propriedade como um certificado X.509 usando o SetCertificate método da X509CertificateInitiatorClientCredential 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 sujeito é usado aqui no caso de o certificado for alterado (devido a uma data de validade). Usar o nome da entidade permite que a infraestrutura localize o certificado novamente.

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

  1. Adicione um elemento ao elemento .

  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 como valores apropriados: storeLocation, , storeNamex509FindTypee findValue, conforme mostrado no código a seguir. Para obter mais informações sobre certificados, consulte Como trabalhar 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 atributo do <endpoint> elemento, conforme mostrado no código a seguir. O elemento de endpoint é um elemento filho do <elemento cliente>. Além disso, especifique o nome da configuração de associaçã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