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>clientCredentialType y establece el atributo a Windows.
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_Windows">
<security mode="Message">
<message clientCredentialType="Windows"
establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!-- other configuration code not shown -->
</system.serviceModel>
</configuration>
El fragmento siguiente de Web Services Description Language (WSDL) muestra la identidad para el extremo previamente definido. En este ejemplo, el servicio se ejecuta como un servicio hospedado por sí mismo bajo una cuenta de usuario determinada (username@contoso.com) y, por consiguiente, la identidad del nombre principal del usuario (UPN) contiene el nombre de cuenta. El UPN también se conoce como el nombre de inicio de sesión de usuario en un dominio de Windows.
<wsdl:service name="CalculatorService">
<wsdl:port name="WSHttpBinding_ICalculator_Windows"
binding="tns:WSHttpBinding_ICalculator_Windows">
<soap12:address
location=
"https://localhost:8003/servicemodelsamples/service/upnidentity" />
<wsa10:EndpointReference>
<wsa10:Address>
https://localhost:8003/servicemodelsamples/service/upnidentity
</wsa10:Address>
<Identity
xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<Upn>username@contoso.com</Upn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
Para obtener más información acerca de una aplicación de muestra que muestre la configuración de identidad, consulte Ejemplo de identidad de servicio. Para obtener más información sobre Acerca de la identidad de servicio, consulte Identidad del servicio y autenticación.
Autenticación e identidad de Kerberos
De forma predeterminada, cuando un servicio se configura para usar una credencial de Windows, se genera un elemento <identity><userPrincipalName> que contiene un elemento<servicePrincipalName> o en el WSDL. Si el servicio se ejecuta bajo la cuenta LocalSystem, LocalService o NetworkService, se genera de forma predeterminada un nombre principal 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.exe 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 descargar la herramienta, consulte Windows 2000 Resource Kit Tool: Setspn.exe. Para obtener más información sobre la herramienta, consulte Setspn Overview.
![]() |
---|
Para usar el tipo de credencial de Windows sin negociación, la cuenta de usuario del servicio debe tener acceso al nombre principal de servicio (SPN) registrado en el dominio de Active Directory. Puede hacer esto de varias formas: |
Use la cuenta NetworkService o LocalSystem para ejecutar el servicio. Dado que esas cuentas tienen acceso al SPN del equipo que se establece cuando el equipo se une al dominio de Active Directory, WCF genera automáticamente el elemento SPN apropiado dentro del extremo del servicio en los metadatos del servicio (WSDL).
Utilice una cuenta de dominio aleatoria 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 a los clientes del servicio a través de 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 obtener más información sobre los SPN, el protocolo Kerberos y Active Directory, consulte Kerberos Technical Supplement for 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 se cambia el tipo de credencial de cliente del enlace mostrado anteriormente a Certificate**,** el WSDL generado contiene un certificado X.509 serializado en 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.
<Identity xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate>
</X509Data>
</KeyInfo>
</Identity>
Puede cambiar el valor de la identidad del servicio predeterminada o cambiar el tipo de la identidad mediante el elemento <identity> en la configuración o estableciendo la identidad en 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 mediante programación de la identidad
Su servicio no tiene que especificar explícitamente una identidad, porque WCF lo determina automáticamente. Sin embargo, WCF le permite especificar una identidad en un extremo, si se requiere. El código siguiente agrega un nuevo extremo de servicio con una identidad de DNS concreta.
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("https://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("https://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Vea también
Tareas
Cómo crear un comprobador de identidad de cliente personalizado