Identidade e autenticação do serviço

A identidade do ponto de extremidade de um serviço é um valor gerado a partir do serviço Web Services Description Language (WSDL). Esse valor, propagado para qualquer cliente, é usado para autenticar o serviço. Depois que o cliente inicia uma comunicação com um ponto de extremidade e o serviço se autentica no cliente, o cliente compara o valor da identidade do ponto de extremidade com o valor real que o processo de autenticação do ponto de extremidade retornou. Se corresponderem, o cliente tem a certeza de que entrou em contato com o ponto de extremidade de serviço esperado. Isso funciona como uma proteção contra phishing , impedindo que um cliente seja redirecionado para um ponto de extremidade hospedado por um serviço mal-intencionado.

Para um aplicativo de exemplo que demonstra a configuração de identidade, consulte Exemplo de identidade de serviço. Para obter mais informações sobre pontos de extremidade e endereços de ponto de extremidade, consulte Endereços.

Nota

Quando você usa NT LanMan (NTLM) para autenticação, a identidade do serviço não é verificada porque, em NTLM, o cliente não consegue autenticar o servidor. O NTLM é usado quando os computadores fazem parte de um grupo de trabalho do Windows ou quando executam uma versão mais antiga do Windows que não oferece suporte à autenticação Kerberos.

Quando o cliente inicia um canal seguro para enviar uma mensagem a um serviço por meio dele, a infraestrutura do Windows Communication Foundation (WCF) autentica o serviço e só envia a mensagem se a identidade do serviço corresponder à identidade especificada no endereço do ponto de extremidade usado pelo cliente.

O processamento de identidade consiste nas seguintes etapas:

  • Em tempo de design, o desenvolvedor cliente determina a identidade do serviço a partir dos metadados do ponto de extremidade (expostos por meio de WSDL).

  • Em tempo de execução, o aplicativo cliente verifica as declarações das credenciais de segurança do serviço antes de enviar quaisquer mensagens para o serviço.

O processamento de identidade no cliente é análogo à autenticação do cliente no serviço. Um serviço seguro não executa código até que as credenciais do cliente tenham sido autenticadas. Da mesma forma, o cliente não envia mensagens para o serviço até que as credenciais do serviço tenham sido autenticadas com base no que é conhecido antecipadamente a partir dos metadados do serviço.

A Identity propriedade da EndpointAddress classe representa a identidade do serviço chamado pelo cliente. O serviço publica o Identity em seus metadados. Quando o desenvolvedor cliente executa a ServiceModel Metadata Utility Tool (Svcutil.exe) no ponto de extremidade do serviço, a configuração gerada contém o valor da propriedade do Identity serviço. A infraestrutura WCF (se configurada com segurança) verifica se o serviço possui a identidade especificada.

Importante

Os metadados contêm a identidade esperada do serviço, portanto, é recomendável que você exponha os metadados do serviço por meios seguros, por exemplo, criando um ponto de extremidade HTTPS para o serviço. Para obter mais informações, consulte Como proteger pontos de extremidade de metadados.

Tipos de identidade

Um serviço pode fornecer seis tipos de identidades. Cada tipo de identidade corresponde a um elemento que pode ser contido dentro do <identity> elemento em configuração. O tipo usado depende do cenário e dos requisitos de segurança do serviço. A tabela a seguir descreve cada tipo de identidade.

Tipo de identidade Description Cenário típico
Sistema de Nomes de Domínio (DNS) Use este elemento com certificados X.509 ou contas do Windows. Ele compara o nome DNS especificado na credencial com o valor especificado neste elemento. Uma verificação de DNS permite que você use certificados com DNS ou nomes de assunto. Se um certificado for reemitido com o mesmo DNS ou nome de assunto, a verificação de identidade ainda será válida. Quando um certificado é reemitido, ele recebe uma nova chave RSA, mas mantém o mesmo DNS ou nome do assunto. Isso significa que os clientes não precisam atualizar suas informações de identidade sobre o serviço.
Certificado. O padrão quando ClientCredentialType é definido como Certificado. Este elemento especifica um valor de certificado X.509 codificado em Base64 para comparar com o cliente.

Use também esse elemento ao usar um CardSpace como uma credencial para autenticar o serviço.
Esse elemento restringe a autenticação a um único certificado com base em seu valor de impressão digital. Isso permite uma autenticação mais rigorosa porque os valores de impressão digital são exclusivos. Isso vem com uma ressalva: se o certificado for reemitido com o mesmo nome de assunto, ele também terá uma nova impressão digital. Portanto, os clientes não são capazes de validar o serviço, a menos que a nova impressão digital seja conhecida. Para obter mais informações sobre como localizar a impressão digital de um certificado, consulte Como recuperar a impressão digital de um certificado.
Referência do certificado Idêntica à opção Certificado descrita anteriormente. No entanto, esse elemento permite especificar um nome de certificado e um local de armazenamento do qual recuperar o certificado. O mesmo que o cenário de certificado descrito anteriormente.

A vantagem é que o local do armazenamento de certificados pode mudar.
RSA Este elemento especifica um valor de chave RSA para comparar com o cliente. Isso é semelhante à opção de certificado, mas em vez de usar a impressão digital do certificado, a chave RSA do certificado é usada. Uma verificação RSA permite restringir especificamente a autenticação a um único certificado com base em sua chave RSA. Isso permite uma autenticação mais rigorosa de uma chave RSA específica em detrimento do serviço, que não funciona mais com clientes existentes se o valor da chave RSA for alterado.
Nome principal do usuário (UPN). O padrão quando o ClientCredentialType é definido como Windows e o processo de serviço não está sendo executado em uma das contas do sistema. Este elemento especifica o UPN no qual o serviço está sendo executado. Consulte a seção Protocolo e identidade Kerberos em Substituindo a identidade de um serviço para autenticação. Isso garante que o serviço esteja sendo executado em uma conta de usuário específica do Windows. A conta de usuário pode ser o usuário conectado atual ou o serviço em execução em uma conta de usuário específica.

Essa configuração aproveita a segurança Kerberos do Windows se o serviço estiver sendo executado em uma conta de domínio em um ambiente do Ative Directory.
Nome da entidade de serviço (SPN). O padrão quando o ClientCredentialType está definido como Windows e o processo de serviço está sendo executado em uma das contas do sistema — LocalService, LocalSystem ou NetworkService. Este elemento especifica o SPN associado à conta do serviço. Consulte a seção Protocolo e identidade Kerberos em Substituindo a identidade de um serviço para autenticação. Isso garante que o SPN e a conta específica do Windows associada ao SPN identifiquem o serviço.

Você pode usar a ferramenta Setspn.exe para associar uma conta de máquina à conta de usuário do serviço.

Essa configuração aproveita a segurança Kerberos do Windows se o serviço estiver sendo executado em uma das contas do sistema ou em uma conta de domínio que tenha um nome SPN associado a ele e o computador for membro de um domínio em um ambiente do Ative Directory.

Especificando a identidade no serviço

Normalmente, não é necessário definir a identidade em um serviço porque a seleção de um tipo de credencial de cliente dita o tipo de identidade exposta nos metadados do serviço. Para obter mais informações sobre como substituir ou especificar a identidade do serviço, consulte Substituindo a identidade de um serviço para autenticação.

Usando o <elemento de identidade> na configuração

Se você alterar o tipo de credencial do cliente na associação mostrada Certificate, anteriormente, o WSDL gerado conterá um certificado X.509 serializado em Base64 para o valor de identidade, conforme mostrado no código a seguir. Este é o padrão para todos os tipos de credenciais de cliente diferentes do Windows.

Você pode alterar o valor da identidade de serviço padrão ou alterar o tipo da identidade usando o <identity> elemento na configuração ou definindo a identidade no código. O código de configuração a seguir define uma identidade de sistema de nomes de domínio (DNS) com o valor contoso.com.

Definindo a identidade programaticamente

Seu serviço não precisa especificar explicitamente uma identidade, porque o WCF a determina automaticamente. No entanto, o WCF permite que você especifique uma identidade em um ponto de extremidade, se necessário. O código a seguir adiciona um novo ponto de extremidade de serviço com uma identidade DNS específica.

ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd

Especificando a identidade no cliente

Em tempo de design, um desenvolvedor cliente normalmente usa a ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar a configuração do cliente. O arquivo de configuração gerado (destinado ao uso pelo cliente) contém a identidade do servidor. Por exemplo, o código a seguir é gerado a partir de um serviço que especifica uma identidade DNS, conforme mostrado no exemplo anterior. Observe que o valor da identidade do ponto de extremidade do cliente corresponde ao do serviço. Nesse caso, quando o cliente recebe as credenciais do Windows (Kerberos) para o serviço, ele espera que o valor seja contoso.com.

Se, em vez do Windows, o serviço especificar um certificado como o tipo de credencial do cliente, espera-se que a propriedade DNS do certificado seja o valor contoso.com. (Ou, se a propriedade DNS for null, o nome do assunto do certificado deve ser contoso.com.)

Usando um valor específico para identidade

O seguinte arquivo de configuração do cliente mostra como a identidade do serviço deve ser um valor específico. No exemplo a seguir, o cliente pode se comunicar com dois pontos de extremidade. O primeiro é identificado com uma impressão digital do certificado e o segundo com uma chave RSA do certificado. Ou seja, um certificado que contém apenas um par de chave pública/chave privada, mas não é emitido por uma autoridade confiável.

Verificação de identidade em tempo de execução

Em tempo de design, um desenvolvedor cliente determina a identidade do servidor por meio de seus metadados. Em tempo de execução, a verificação de identidade é executada antes de chamar quaisquer pontos de extremidade no serviço.

O valor de identidade está vinculado ao tipo de autenticação especificado pelos metadados; em outras palavras, o tipo de credenciais usadas para o serviço.

Se o canal estiver configurado para autenticar usando SSL (Secure Sockets Layer) no nível de mensagem ou transporte com certificados X.509 para autenticação, os seguintes valores de identidade serão válidos:

  • DNS. O WCF garante que o certificado fornecido durante o handshake SSL contenha um atributo DNS ou CommonName (CN) igual ao valor especificado na identidade DNS no cliente. Observe que essas verificações são feitas além de determinar a validade do certificado do servidor. Por padrão, o WCF valida que o certificado do servidor é emitido por uma autoridade raiz confiável.

  • Certificado. Durante o handshake SSL, o WCF garante que o ponto de extremidade remoto forneça o valor exato do certificado especificado na identidade.

  • Referência do certificado. O mesmo que Certificado.

  • RSA. Durante o handshake SSL, o WCF garante que o ponto de extremidade remoto forneça a chave RSA exata especificada na identidade.

Se o serviço autenticar usando SSL de nível de mensagem ou transporte com uma credencial do Windows para autenticação e negociar a credencial, os seguintes valores de identidade serão válidos:

  • DNS. A negociação passa pelo SPN do serviço para que o nome DNS possa ser verificado. O SPN está na forma host/<dns name>.

  • SPN. Um SPN de serviço explícito é retornado, por exemplo, host/myservice.

  • UPN. O UPN da conta de serviço. A UPN está na forma username@domain. Por exemplo, quando o serviço está sendo executado em uma conta de usuário, pode ser username@contoso.com.

Especificar a identidade programaticamente (usando a Identity propriedade) é opcional. Se nenhuma identidade for especificada e o tipo de credencial do cliente for Windows, o padrão será SPN com o valor definido como a parte do nome do host do endereço do ponto de extremidade do serviço prefixado com o literal "host/". Se nenhuma identidade for especificada e o tipo de credencial do cliente for um certificado, o padrão será Certificate. Isso se aplica à segurança em nível de mensagem e transporte.

Identidade e ligações personalizadas

Como a identidade de um serviço depende do tipo de associação usado, certifique-se de que uma identidade apropriada seja exposta ao criar uma associação personalizada. Por exemplo, no exemplo de código a seguir, a identidade exposta não é compatível com o tipo de segurança, porque a identidade para a vinculação de bootstrap de conversa segura não corresponde à identidade para a associação no ponto de extremidade. A ligação de conversação segura define a identidade DNS, enquanto a WindowsStreamSecurityBindingElement define a identidade UPN ou SPN.

CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
    CreateSecureConversationBindingElement(
    SecurityBindingElement.
    CreateIssuedTokenForSslBindingElement(
    new IssuedSecurityTokenParameters())));

// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());
Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))

' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())

Para obter mais informações sobre como empilhar elementos de vinculação corretamente para uma associação personalizada, consulte Criando ligações definidas pelo usuário. Para obter mais informações sobre como criar uma associação personalizada com o SecurityBindingElement, consulte Como criar um SecurityBindingElement para um modo de autenticação especificado.

Consulte também