Comparteix a través de


Invalidación de la identidad de un servicio para la autenticación

Normalmente, no tiene que establecer la identidad en un servicio porque la selección de un tipo de credencial de cliente dicta el tipo de identidad expuesto en los metadatos del servicio. Por ejemplo, el código de configuración siguiente utiliza el elemento <wsHttpBinding> y establece el atributo clientCredentialType en Windows.

El fragmento siguiente de Lenguaje de descripción de servicios Web (WSDL) muestra la identidad para el punto de conexión previamente definido. En este ejemplo, el servicio se ejecuta como un servicio autohospedado bajo una cuenta de usuario determinada (username@contoso.com) y, por consiguiente, la identidad del nombre principal del usuario (UPN) contiene el nombre de la cuenta. El UPN también se conoce como nombre de inicio de sesión de usuario en un dominio de Windows.

Para ver una aplicación de ejemplo que muestre la configuración de identidad, consulte Ejemplo de identidad de servicio. Para más información sobre la identidad de servicio, consulte Identidad de servicio y autenticación.

Autenticación e identidad de Kerberos

De forma predeterminada, cuando un servicio está configurado para usar una credencial de Windows, se genera un elemento <identity> que contiene un elemento <userPrincipalName> o <servicePrincipalName> en el WSDL. Si el servicio se ejecuta con la cuenta LocalSystem, LocalService o NetworkService, se genera de forma predeterminada un nombre de entidad de seguridad de servicio (SPN) con el formato host/<nombredehost> porque esas cuentas tienen acceso a los datos SPN del equipo. Si el servicio se ejecuta con una cuenta diferente, Windows Communication Foundation (WCF) genera un UPN con el formato <nombredeusuario>@<nombrededominio>. Esto ocurre porque la autenticación Kerberos requiere que se proporcione un UPN o SPN al cliente para autenticar el servicio.

También puede utilizar la herramienta Setspn para registrar un SPN adicional con la cuenta de un servicio en un dominio. Puede utilizar a continuación el SPN como la identidad del servicio. Para más información sobre la herramienta, consulte Introducción a Setspn.

Nota

Para usar el tipo de credencial de Windows sin negociación, la cuenta de usuario del servicio debe tener acceso al nombre de entidad de seguridad de servicio (SPN) registrado en el dominio de Active Directory. Puede hacer esto de las siguientes maneras:

  • Use la cuenta NetworkService o LocalSystem para ejecutar el servicio. Dado que esas cuentas tienen acceso al SPN de la máquina que se establece cuando la máquina se une al dominio de Active Directory, WCF genera automáticamente el elemento SPN apropiado dentro del punto de conexión del servicio en los metadatos del servicio (WSDL).

  • Utilice una cuenta de dominio arbitraria de Active Directory para ejecutar el servicio. En este caso, establezca un SPN para esa cuenta de dominio, lo cual puede llevar a cabo utilizando la herramienta de utilidad Setspn.exe. Una vez creado el SPN para la cuenta del servicio, configure WCF para publicar ese SPN en los clientes del servicio mediante sus metadatos (WSDL). Para ello, hay que establecer la identidad del extremo para el extremo expuesto, ya sea mediante un archivo de configuración de la aplicación o el código.

Para más información sobre los SPN, el protocolo Kerberos y Active Directory, consulte Complemento técnico de Kerberos para Windows.

Cuando SPN o UPN es igual a la cadena vacía

Si establece el SPN o el UPN igual a una cadena vacía, pueden ocurrir varias cosas diferentes, según el nivel de seguridad y modo de autenticación que se use:

  • Si está usando la seguridad de nivel de transporte, se elige la autenticación NT LanMan (NTLM).

  • Si usa la seguridad de nivel de mensaje, se puede producir un error en la autenticación, en función del modo de autenticación:

  • Si usa el modo spnego y el atributo AllowNtlm está establecido en false, se produce un error de autenticación.

  • Si usa el modo spnego y el atributo AllowNtlm está establecido en true, se produce un error de autenticación si el UPN está vacío, pero se realiza correctamente si el SPN está vacío.

  • Si usa Kerberos directo (también conocido como "de una vez"), se produce un error de autenticación.

Uso del elemento <identity> en la configuración

Si cambia el tipo de credencial de cliente en el enlace a Certificate mostrado anteriormente, entonces el WSDL generado contiene un certificado X.509 serializado con Base64 para el valor de identidad, como se muestra en el código siguiente. Éste es el valor predeterminado para todos los tipos de credencial de cliente excepto Windows.

Puede cambiar el valor de la identidad de servicio predeterminada o el tipo de la identidad con el elemento <identity> en la configuración o estableciendo la identidad en el código. El código de configuración siguiente establece una identidad del sistema de nombres de dominio (DNS) con el valor contoso.com.

Establecimiento de la identidad mediante programación

Su servicio no tiene que especificar explícitamente una identidad, porque WCF la determina automáticamente. Sin embargo, WCF le permite especificar una identidad en un punto de conexión, si es necesario. El código siguiente agrega un nuevo punto de conexión de servicio con una identidad de DNS concreta.

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 también