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