Partilhar via


Como: Especificar Valores de Credenciais de Cliente

Usando o Windows Communication Foundation (WCF), o serviço pode especificar como um cliente é autenticado ao 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. Recuperar os metadados a partir do endpoint de metadados do serviço. Os metadados consistem tipicamente em dois ficheiros: o código cliente na linguagem de programação da sua escolha (o padrão é Visual C#) e um ficheiro de configuração XML. Uma forma de recuperar metadados é usar a ferramenta Svcutil.exe para devolver o código do cliente e a configuração do cliente. Para mais informações, consulte Recuperação de Metadados e Ferramenta Utilitária de Metadados de Modelos de Serviço (Svcutil.exe).

  2. Abra o ficheiro de configuração XML. Se usares a ferramenta Svcutil.exe, o nome padrão do ficheiro é Output.config.

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

  4. Encontre o elemento filho que corresponda ao valor do modo. Por exemplo, se o modo estiver definido para Mensagem, encontre o <elemento mensagem> contido no <elemento de segurança> .

  5. Note o valor atribuído ao clientCredentialType atributo. O valor real depende do modo utilizado, transporte ou mensagem.

O seguinte código XML mostra a configuração de um cliente que utiliza a segurança de mensagens e requer 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 do Cliente

Este exemplo define o modo de segurança para modo Transporte e define o valor da credencial do cliente para um certificado X.509. Os procedimentos seguintes demonstram como definir o valor da credencial do cliente no cliente em código e configuração. Isto pressupõe que utilizou a Ferramenta Utilitária de Metadados do Modelo de Serviço (Svcutil.exe) para devolver os metadados (código e configuração) do serviço. Para mais informações, veja Como: Criar um Cliente.

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

  1. Use a Ferramenta de Utilidade de Metadados do Modelo de Serviço (Svcutil.exe) para gerar código e 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 ClientCredentials propriedade da ClientBase<TChannel> classe a um valor apropriado. Este exemplo define a propriedade para 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
    

    Podes usar qualquer uma das enumerações da X509FindType classe. O nome do sujeito é usado aqui caso o certificado seja alterado (devido ao prazo de validade). Usar o nome do assunto permite que a infraestrutura volte a encontrar o certificado.

Para especificar o valor de credencial do cliente no cliente em configuração

  1. Adiciona um <elemento de comportamento> ao <elemento de comportamentos> .

  2. Adicione um <elemento credenciaisCliente> ao <comportamento>. 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, x509FindType, e findValue, conforme mostrado no código seguinte. Para mais informações sobre certificados, consulte 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 seguinte. O elemento endpoint é um filho do <elemento cliente> . Além disso, especifique o nome da configuração de binding definindo o atributo bindingConfiguration do binding para o cliente. Se estiver a usar um ficheiro de configuração gerado, o nome da ligação é 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