Partilhar via


Protegendo clientes

No Windows Communication Foundation (WCF), o serviço dita os requisitos de segurança para os clientes. Ou seja, o serviço especifica qual modo de segurança usar e se o cliente deve ou não fornecer uma credencial. O processo de proteger um cliente, portanto, é simples: usar os metadados obtidos do serviço (se for publicado) e construir um cliente. Os metadados especificam como configurar o cliente. Se o serviço exigir que o cliente forneça uma credencial, você deverá obter uma credencial que atenda ao requisito. Este tópico discute o processo em mais detalhes. Para obter mais informações sobre como criar um serviço seguro, consulte Protegendo serviços.

O serviço especifica a segurança

Por padrão, as associações WCF têm recursos de segurança habilitados. (A exceção é o BasicHttpBinding.) Portanto, se o serviço foi criado usando WCF, há uma maior chance de que ele implemente segurança para garantir autenticação, confidencialidade e integridade. Nesse caso, os metadados fornecidos pelo serviço indicarão o que é necessário para estabelecer um canal de comunicação seguro. Se os metadados do serviço não incluírem nenhum requisito de segurança, não há como impor um esquema de segurança, como SSL (Secure Sockets Layer) sobre HTTP, em um serviço. Se, no entanto, o serviço exigir que o cliente forneça uma credencial, o desenvolvedor, implantador ou administrador do cliente deverá fornecer a credencial real que o cliente usará para autenticar-se no serviço.

Obtenção de metadados

Ao criar um cliente, a primeira etapa é obter os metadados para o serviço com o qual o cliente se comunicará. Isto pode ser feito de duas formas. Primeiro, se o serviço publicar um ponto de extremidade de troca de metadados (MEX) ou disponibilizar seus metadados por HTTP ou HTTPS, você poderá baixar os metadados usando a ServiceModel Metadata Utility Tool (Svcutil.exe), que gera arquivos de código para um cliente e um arquivo de configuração. (Para obter mais informações sobre como usar a ferramenta, consulte Acessando serviços usando um cliente WCF.) Se o serviço não publicar um ponto de extremidade MEX e também não disponibilizar seus metadados por HTTP ou HTTPS, entre em contato com o criador do serviço para obter documentação que descreva os requisitos de segurança e os metadados.

Importante

Recomenda-se que os metadados provenham de uma fonte fidedigna e que não sejam adulterados. Os metadados recuperados usando o protocolo HTTP são enviados em texto não criptografado e podem ser adulterados. Se o serviço usar as HttpsGetEnabled propriedades e HttpsGetUrl , use a URL que o criador do serviço forneceu para baixar os dados usando o protocolo HTTPS.

Validando a segurança

As fontes de metadados podem ser divididas em duas grandes categorias: fontes confiáveis e fontes não confiáveis. Se você confia em uma fonte e baixou o código do cliente e outros metadados do ponto de extremidade MEX seguro dessa fonte, então você pode criar o cliente, fornecê-lo com as credenciais certas e executá-lo sem outras preocupações.

No entanto, se você optar por baixar um cliente e metadados de uma fonte sobre a qual você sabe pouco, certifique-se de validar as medidas de segurança que o código usa. Por exemplo, você não deve simplesmente criar um cliente que envia suas informações pessoais ou financeiras para um serviço, a menos que o serviço exija confidencialidade e integridade (no mínimo). Você deve confiar no proprietário do serviço na medida em que estiver disposto a divulgar tais informações, porque essas informações serão visíveis para eles.

Como regra, portanto, ao usar código e metadados de uma fonte não confiável, verifique o código e os metadados para garantir que ele atenda ao nível de segurança necessário.

Definindo uma credencial de cliente

A definição de uma credencial de cliente em um cliente consiste em duas etapas:

  1. Determine o tipo de credencial de cliente que o serviço requer. Isto é conseguido através de um de dois métodos. Primeiro, se você tiver documentação do criador do serviço, ele deve especificar o tipo de credencial do cliente (se houver) que o serviço exige. Em segundo lugar, se você tiver apenas um arquivo de configuração gerado pela ferramenta Svcutil.exe, poderá examinar as associações individuais para determinar qual tipo de credencial é necessário.

  2. Especifique uma credencial de cliente real. A credencial de cliente real é chamada de valor de credencial de cliente para distingui-la do tipo. Por exemplo, se o tipo de credencial do cliente especificar um certificado, você deverá fornecer um certificado X.509 emitido por uma autoridade de certificação na qual o serviço confia.

Determinando o tipo de credencial do cliente

Se você tiver o arquivo de configuração que a ferramenta Svcutil.exe gerou, examine a <seção de associações para determinar qual tipo de> credencial de cliente é necessário. Dentro da seção há elementos vinculativos que especificam os requisitos de segurança. Especificamente, examine o <elemento de segurança> de cada ligação. Esse elemento inclui o mode atributo, que você pode definir como um dos três valores possíveis (Message, Transport, ou TransportWithMessageCredential). O valor do atributo determina o modo e o modo determina qual dos elementos filho é significativo.

O <security> elemento pode conter um <transport> ou um elemento ou <message> ambos. O elemento significativo é aquele que corresponde ao modo de segurança. Por exemplo, o código a seguir especifica que o modo de segurança é "Message", e o tipo de credencial de cliente para o <message> elemento é "Certificate". Nesse caso, o <transport> elemento pode ser ignorado. No entanto, o <message> elemento especifica que um certificado X.509 deve ser fornecido.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"
                      realm="" />  
           <message clientCredentialType="Certificate"
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Observe que, se o clientCredentialType atributo estiver definido como "Windows", como mostrado no exemplo a seguir, não será necessário fornecer um valor de credencial real. Isso ocorre porque a segurança integrada do Windows fornece a credencial real (um token Kerberos) da pessoa que está executando o cliente.

<security mode="Message">  
    <transport clientCredentialType="Windows "
        realm="" />  
</security>  

Definindo o valor da credencial do cliente

Se for determinado que o cliente deve fornecer uma credencial, use o método apropriado para configurar o cliente. Por exemplo, para definir um certificado de cliente, use o SetCertificate método.

Uma forma comum de credencial é o certificado X.509. Você pode fornecer a credencial de duas maneiras:

  • Programando-o no código do seu cliente (usando o SetCertificate método).

Adicionando uma <seção de comportamentos> do arquivo de configuração para o cliente e usando o clientCredentials elemento (mostrado abaixo).

Definindo um <valor clientCredentials> no código

Para definir um <valor clientCredentials> no código, você deve acessar a ClientCredentialsClientBase<TChannel> propriedade da classe. A propriedade retorna um ClientCredentials objeto que permite acesso a vários tipos de credenciais, conforme mostrado na tabela a seguir.

Propriedade ClientCredential Description Notas
ClientCertificate Devolve um X509CertificateInitiatorClientCredential Representa um certificado X.509 fornecido pelo cliente para autenticar-se no serviço.
HttpDigest Devolve um HttpDigestClientCredential Representa uma credencial de resumo HTTP. A credencial é um hash do nome de usuário e senha.
IssuedToken Devolve um IssuedTokenClientCredential Representa um token de segurança personalizado emitido por um Serviço de Token de Segurança, normalmente usado em cenários de federação.
Peer Devolve um PeerCredential Representa uma credencial Peer para participação em uma malha Peer em um domínio do Windows.
ServiceCertificate Devolve um X509CertificateRecipientClientCredential Representa um certificado X.509 fornecido pelo serviço em uma negociação fora de banda.
UserName Devolve um UserNamePasswordClientCredential Representa um par de nome de usuário e senha.
Windows Devolve um WindowsClientCredential Representa uma credencial de cliente Windows (uma credencial Kerberos). As propriedades da classe são somente leitura.

Definindo um <valor clientCredentials> na configuração

Os valores de credenciais são especificados usando um comportamento de ponto de extremidade como elementos filho do elemento clientCredentials>.< O elemento usado depende do tipo de credencial do cliente. Por exemplo, o exemplo a seguir mostra a configuração para definir um certificado X.509 usando o <<clientCertificate>.

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  
</configuration>  

Para definir a credencial do cliente na configuração, adicione um <elemento endpointBehaviors> ao arquivo de configuração. Além disso, o elemento de comportamento adicionado deve ser vinculado ao ponto de extremidade do serviço usando o behaviorConfiguration atributo do ponto de <extremidade> do elemento cliente<>, conforme mostrado no exemplo a seguir. O valor do behaviorConfiguration atributo deve corresponder ao valor do atributo behavior name .

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                behaviorConfiguration="myEndpointBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

Nota

Alguns dos valores de credenciais do cliente não podem ser definidos usando arquivos de configuração do aplicativo, por exemplo, nome de usuário e senha ou valores de usuário e senha do Windows. Esses valores de credenciais podem ser especificados somente no código.

Para obter mais informações sobre como definir a credencial do cliente, consulte Como especificar valores de credencial do cliente.

Nota

ClientCredentialType é ignorado quando SecurityMode é definido como "TransportWithMessageCredential", conforme mostrado na configuração de exemplo a seguir.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"
               establishSecurityContext="false"
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Consulte também