Identidade e autenticação de serviço

A identidade do ponto de extremidade de um serviço é um valor gerado a partir da linguagem WSDL (Web Services Description Language). 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 para o cliente, o cliente compara o valor de identidade do ponto de extremidade com o valor real retornado pelo processo de autenticação do ponto de extremidade. Se corresponderem, o cliente terá 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 obter um aplicativo de exemplo que demonstra a configuração de identidade, consulte Exemplo de identidade do serviço. Para obter mais informações sobre pontos de extremidade e endereços de ponto de extremidade, consulte Endereços.

Observação

Quando você usa o 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 ao executar uma versão mais antiga do Windows que não dá suporte à autenticação Kerberos.

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

O processamento de identidade consiste nos seguintes estágios:

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

  • No tempo de execução, o aplicativo cliente verifica as declarações das credenciais de segurança do serviço antes de enviar 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 o 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 com antecedência dos metadados do serviço.

A propriedade Identity da classe EndpointAddress representa a identidade do serviço chamado pelo cliente. O serviço publica Identity em seus metadados. Quando o desenvolvedor cliente executa a Ferramenta do Utilitário de Metadados do ServiceModel (Svcutil.exe) no ponto de extremidade de serviço, a configuração gerada contém o valor da propriedade Identity do serviço. A infraestrutura do 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 expor os metadados de serviço por meio de meios seguros, por exemplo, criando um ponto de extremidade HTTPS para o serviço. Para obter mais informações, confira 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 elemento <identity> na 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 Descrição Cenário típico
Sistema de nome de domínio (DNS) Use esse 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 DNS permite que você use certificados com DNS ou nomes de entidade. Se um certificado for emitido novamente com o mesmo DNS ou nome da entidade, a verificação de identidade ainda será válida. Quando um certificado é emitido novamente, ele obtém uma nova chave RSA, mas mantém o mesmo nome de assunto ou DNS. 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. Esse 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 emitido novamente com o mesmo nome da entidade, ele também terá uma nova impressão digital. Portanto, os clientes não podem 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êntico à opção Certificado descrita anteriormente. No entanto, esse elemento permite que você especifique um nome de certificado e local do repositório do qual recuperar o certificado. Igual ao cenário de certificado descrito anteriormente.

O benefício é que o local do repositório de certificados pode ser alterado.
RSA Esse elemento especifica um valor de chave de RSA a ser comparado com o cliente. Isso é semelhante à opção de certificado, mas, em vez de usar a impressão digital do certificado, a chave de RSA do certificado é usada em vez disso. Uma verificação de RSA permite restringir especificamente a autenticação a um único certificado com base na chave de RSA própria ou em um valor de chave de RSA gerado por você. Isso permite a autenticação mais rigorosa de uma chave de RSA específica às custas do serviço, que não funcionará mais com clientes existentes se o valor da chave de RSA for alterado.
Nome UPN. O padrão quando ClientCredentialType é definido como Windows e o processo de serviço não está em execução em uma das contas do sistema. Esse elemento especifica o UPN no qual o serviço está sendo executado. Consulte a seção Protocolo Kerberos e identidade de Substituindo a identidade de um serviço para autenticação. Isso garante que o serviço esteja em execução em uma conta de usuário do Windows específica. 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 aproveitará a segurança do Kerberos Windows se o serviço estiver em execução em uma conta de domínio em um ambiente do Active Directory.
SPN (Nome da entidade de serviço). O padrão quando o processo ClientCredentialType é definido como Windows e o processo de serviço está em execução em uma das contas do sistema: LocalService, LocalSystem ou NetworkService. Esse elemento especifica o SPN associado à conta do serviço. Consulte a seção Protocolo Kerberos e identidade de 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 computador à conta de usuário do serviço.

Essa configuração aproveitará a segurança do Kerberos Windows se o serviço estiver em execução em uma das contas do sistema ou em uma conta de domínio que tenha um nome SPN associado e o computador for membro de um domínio dentro de um ambiente do Active Directory.

Especificando identidade no serviço

Normalmente, você não precisa 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 de serviço. Para obter mais informações sobre como substituir ou especificar a identidade de serviço, consulte Substituir a identidade de um serviço para autenticação.

Usando o elemento <identity> na configuração

Se você alterar o tipo de credencial do cliente na associação mostrada anteriormente para Certificate,, o WSDL gerado conterá um certificado X.509 serializado Base64 para o valor de identidade, conforme mostrado no código a seguir. Esse é 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 elemento <identity> na configuração ou definindo a identidade no código. O código de configuração a seguir define uma identidade DNS (Sistema de Nomes de Domínio) com o valor contoso.com.

Configurando identidade programaticamente

Seu serviço não precisa especificar explicitamente uma identidade, pois 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 identidade no cliente

No tempo de design, um desenvolvedor cliente normalmente usa a Ferramenta do Utilitário de Metadados do ServiceModel (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 de 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 da entidade do certificado deverá ser contoso.com.)

Usando um valor específico para identidade

O arquivo de configuração do cliente a seguir 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. A primeira é identificada com uma impressão digital de certificado, e a segunda, com uma chave RSA de 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 no tempo de execução

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

O valor de identidade está vinculado ao tipo de autenticação especificado por 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) de nível de transporte ou mensagem 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 o SPN do serviço para que o nome DNS possa ser verificado. O SPN está no formulário host/<dns name>.

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

  • UPN. O UPN da conta de serviço. O UPN está no formulário username@domain. Por exemplo, quando o serviço está em execução em uma conta de usuário, ele pode ser username@contoso.com.

Especificar a identidade programaticamente (usando a propriedade Identity) é 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 de nome do host do endereço do ponto de extremidade de 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 no nível da mensagem e do transporte.

Identidade e associações personalizadas

Como a identidade de um serviço depende do tipo de associação usado, verifique se uma identidade apropriada é 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, pois a identidade da associação de inicialização de conversa segura não corresponde à identidade da associação no ponto de extremidade. A associação de conversa segura define a identidade DNS, enquanto 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 associação corretamente para uma associação personalizada, consulte Criando associaçõ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.

Confira também