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

O seguinte fragmento WSDL (Web Services Description Language) 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 UPN (nome principal do 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 um aplicativo de exemplo que demonstra a configuração de identidade, consulte Exemplo de identidade de serviço. Para obter mais informações sobre a identidade do serviço, consulte Identidade e autenticação do serviço.

Autenticação e identidade Kerberos

Por padrão, quando um serviço é configurado para usar uma credencial do Windows, um <elemento de identidade> que contém um< elemento userPrincipalName> ou< servicePrincipalName> é gerado no WSDL. Se o serviço estiver sendo executado sob o LocalSystem, LocalServiceou NetworkService conta, um SPN (nome da entidade de serviço) será gerado por padrão na forma de nome> de<host/ host porque essas contas têm acesso aos dados SPN do computador. Se o serviço estiver sendo executado em uma conta diferente, o Windows Communication Foundation (WCF) gerará um UPN na forma de <username>@<domainName>. Isso ocorre porque a autenticação Kerberos requer 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 a ferramenta, consulte Visão geral do Setspn.

Nota

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 Ative Directory. É possível efetuar isto das formas seguintes:

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

  • Use uma conta de domínio arbitrária do Ative 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 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 exposto, seja por meio de um arquivo ou código de configuração do aplicativo.

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

Quando 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 acontecerão, dependendo do nível de segurança e do modo de autenticação que está sendo usado:

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

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

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

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

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

Usar o <elemento identity> na configuração

Se você alterar o tipo de credencial de cliente na associação mostrada anteriormente para Certificate, 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.

Definir 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

Consulte também