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 atributoAllowNtlm
estiver definido comofalse
, a autenticação falhará.Se você estiver usando o modo
spnego
e o atributoAllowNtlm
estiver definido comotrue
, 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