Compartilhar via


Substituir a identidade de um serviço pela autenticaçã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. Por exemplo, o código de configuração a seguir usa o elemento <wsHttpBinding> e define o atributo clientCredentialType como Windows.

O fragmento de WSDL (Linguagem WSDL) dos Serviços Web a seguir mostra a identidade do ponto de extremidade definido anteriormente. Neste exemplo, o serviço está sendo executado como um serviço auto-hospedado em uma conta de usuário específica (username@contoso.com) e, portanto, a identidade do UPN (nome da entidade de usuário) contém o nome da conta. O UPN também é conhecido como o nome de entrada do usuário em um domínio do Windows.

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 identidade do serviço, consulte Identidade do serviço e autenticação.

Autenticação e identidade do Kerberos

Por padrão, quando um serviço é configurado para usar uma credencial do Windows, um elemento <identity> que contém um elemento <userPrincipalName> ou <servicePrincipalName> é gerado no WSDL. Se o serviço estiver em execução na conta LocalSystem, LocalService ou NetworkService, um SPN (nome da entidade de serviço) será gerado por padrão na forma de host/<hostname> porque essas contas têm acesso aos dados SPN do computador. Se o serviço estiver em execução em uma conta diferente, o WCF (Windows Communication Foundation) gerará um UPN na forma de <username>@<domainName>. Isso ocorre porque a autenticação Kerberos exige que um UPN ou SPN seja fornecido ao cliente para autenticar o serviço.

Você também pode usar a ferramenta Setspn para registrar um SPN adicional com a conta de um serviço em um domínio. Em seguida, você pode usar o SPN como a identidade do serviço. Para obter mais informações sobre essa ferramenta, consulte Visão geral do Setspn.

Observação

Para usar o tipo de credencial do Windows sem negociação, a conta de usuário do serviço deve ter acesso ao SPN registrado no domínio do Active Directory. É possível fazer isso das seguintes maneiras:

  • Use a conta NetworkService ou LocalSystem para executar seu serviço. Como essas contas têm acesso ao SPN do computador que é estabelecido quando o computador ingressa no domínio do Active Directory, o WCF gera automaticamente o elemento SPN apropriado dentro do ponto de extremidade do serviço no WSDL (metadados do serviço).

  • Use uma conta de domínio arbitrária do Active Directory para executar seu serviço. Nesse caso, estabeleça um SPN para essa conta de domínio, o que você pode fazer usando a ferramenta de utilitário Setspn.exe. Depois de criar o SPN para a conta do serviço, configure o WCF para publicar esse SPN para os clientes do serviço por meio de seus metadados (WSDL). Isso é feito definindo a identidade do ponto de extremidade para o ponto de extremidade exposto, seja por meio de um arquivo de configuração de aplicativo ou código.

Para obter mais informações sobre SPNs, o protocolo Kerberos e o Active Directory, consulte Suplemento Técnico Kerberos para Windows.

Quando o SPN ou UPN é igual à cadeia de caracteres vazia

Se você definir o SPN ou UPN igual a uma cadeia de caracteres vazia, várias coisas diferentes ocorrerão, dependendo do nível de segurança e do modo de autenticação que está sendo usado:

  • Se você estiver usando a segurança no nível de transporte, será escolhida a autenticação NT LanMan (NTLM).

  • Se você estiver usando a segurança no nível da mensagem, a autenticação pode falhar, dependendo do modo de autenticação:

  • Se você estiver usando o modo spnego e o atributo AllowNtlm estiver definido como false, a autenticação falhará.

  • Se você estiver usando o modo spnego e o atributo AllowNtlm estiver definido como true, a autenticação falhará se o UPN estiver vazio, mas obterá êxito se o SPN estiver vazio.

  • Se você estiver usando o Kerberos direto (também conhecido como "one-shot"), a autenticação falhará.

Usar 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.

Configurar identidade de forma programática

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, caso 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

Confira também