Compartir a través de


Cierre de sesión único de OpenID Connect con AD FS

Información general

Basándose en la compatibilidad inicial con Oauth de AD FS en Windows Server 2012 R2, AD FS 2016 introdujo la compatibilidad con el inicio de sesión de OpenId Connect. Con la actualización KB4038801, AD FS 2016 ahora admite el cierre de sesión único para escenarios de OpenId Connect. En este artículo se proporciona información general sobre el cierre de sesión único de OpenId Connect, junto con instrucciones para usarlo con las aplicaciones de OpenId Connect en AD FS.

Documento de detección

OpenID Connect usa un documento JSON denominado "documento de detección" para proporcionar detalles sobre la configuración. Este documento incluye URI de autenticación, tokens, información del usuario y puntos de conexión públicos. A continuación se muestra un ejemplo del documento de detección.

{
"issuer":"https://fs.fabidentity.com/adfs",
"authorization_endpoint":"https://fs.fabidentity.com/adfs/oauth2/authorize/",
"token_endpoint":"https://fs.fabidentity.com/adfs/oauth2/token/",
"jwks_uri":"https://fs.fabidentity.com/adfs/discovery/keys",
"token_endpoint_auth_methods_supported":["client_secret_post","client_secret_basic","private_key_jwt","windows_client_authentication"],
"response_types_supported":["code","id_token","code id_token","id_token token","code token","code id_token token"],
"response_modes_supported":["query","fragment","form_post"],
"grant_types_supported":["authorization_code","refresh_token","client_credentials","urn:ietf:params:oauth:grant-type:jwt-bearer","implicit","password","srv_challenge"],
"subject_types_supported":["pairwise"],
"scopes_supported":["allatclaims","email","user_impersonation","logon_cert","aza","profile","vpn_cert","winhello_cert","openid"],
"id_token_signing_alg_values_supported":["RS256"],
"token_endpoint_auth_signing_alg_values_supported":["RS256"],
"access_token_issuer":"http://fs.fabidentity.com/adfs/services/trust",
"claims_supported":["aud","iss","iat","exp","auth_time","nonce","at_hash","c_hash","sub","upn","unique_name","pwd_url","pwd_exp","sid"],
"microsoft_multi_refresh_token":true,
"userinfo_endpoint":"https://fs.fabidentity.com/adfs/userinfo",
"capabilities":[],
"end_session_endpoint":"https://fs.fabidentity.com/adfs/oauth2/logout",
"as_access_token_token_binding_supported":true,
"as_refresh_token_token_binding_supported":true,
"resource_access_token_token_binding_supported":true,
"op_id_token_token_binding_supported":true,
"rp_id_token_token_binding_supported":true,
"frontchannel_logout_supported":true,
"frontchannel_logout_session_supported":true
}

Los siguientes valores adicionales estarán disponibles en el documento de detección para indicar la compatibilidad con Front Channel Logout:

  • frontchannel_logout_supported: el valor será "true".
  • frontchannel_logout_session_supported: el valor será "true".
  • end_session_endpoint: este es el URI de cierre de sesión de OAuth que el cliente puede usar para iniciar el cierre de sesión en el servidor.

Configuración del servidor de AD FS

La propiedad EnableOAuthLogout de AD FS se habilita de forma predeterminada. Esta propiedad le indica al servidor de AD FS que busque la dirección URL (LogoutURI) con el SID para iniciar el cierre de sesión en el cliente. Si no tiene instalada la actualización KB4038801, puede usar el siguiente comando de PowerShell:

Set-ADFSProperties -EnableOAuthLogout $true

Nota

El parámetro EnableOAuthLogout se marca como obsoleto después de instalar la actualización KB4038801. EnableOAUthLogout siempre es true y no tiene ningún impacto en la funcionalidad de cierre de sesión.

Nota

frontchannel_logout se admite únicamente después de instalar la actualización KB4038801.

Configuración de cliente

El cliente debe implementar una dirección URL que "cierra la sesión" del usuario que ha iniciado sesión. El administrador puede configurar LogoutUri en la configuración del cliente con los siguientes cmdlets de PowerShell.

  • (Add | Set)-AdfsNativeApplication
  • (Add | Set)-AdfsServerApplication
  • (Add | Set)-AdfsClient
Set-AdfsClient -LogoutUri <url>

LogoutUri es la dirección URL que usa AD FS para "cerrar la sesión" del usuario. Para implementar LogoutUri, el cliente debe asegurarse de que borra el estado de autenticación del usuario en la aplicación, por ejemplo, quitando los tokens de autenticación que tiene. AD FS irá a esa dirección URL, con el SID como parámetro de consulta, lo que le indica al usuario de confianza o la aplicación que cierre la sesión del usuario.

AD FS log off user diagram

  1. Token de OAuth con identificador de sesión: AD FS incluye el identificador de sesión en el token de OAuth cuando se emite el token id_token. AD FS usará esto más adelante para identificar las cookies de SSO pertinentes que deben borrarse para el usuario.
  2. El usuario inicia el cierre de sesión en App1: el usuario puede iniciar un cierre de sesión desde cualquiera de las aplicaciones que han iniciado sesión. En este escenario de ejemplo, un usuario inicia un cierre de sesión desde App1.
  3. La aplicación envía una solicitud de cierre de sesión a AD FS: después de iniciar sesión el usuario, la aplicación envía una solicitud GET a end_session_endpoint de AD FS. Opcionalmente, la aplicación puede incluir id_token_hint como parámetro para esta solicitud. Si id_token_hint está presente, AD FS lo usará junto con el identificador de sesión para averiguar a qué URI debe redirigirse el cliente después del cierre de sesión (post_logout_redirect_uri). post_logout_redirect_uri debe ser un URI válido registrado en AD FS con el parámetro RedirectUris.
  4. AD FS envía el cierre de sesión a los clientes que han iniciado sesión: AD FS usa el valor del identificador de sesión para buscar los clientes pertinentes en los que el usuario ha iniciado sesión. A los clientes identificados se les envía una solicitud en el LogoutUri registrado en AD FS para iniciar un cierre de sesión en el lado cliente.

Preguntas más frecuentes

P: No veo los parámetros frontchannel_logout_supported y frontchannel_logout_session_supported en el documento de detección.
R: Asegúrese de que tiene instalada la actualización KB4038801 en todos los servidores de AD FS. Consulte la información sobre el cierre de sesión único en Server 2016 con la actualización KB4038801.

P: He configurado el cierre de sesión único como se indica, pero el usuario permanece conectado en otros clientes.
R: Asegúrese de que LogoutUri está establecido para todos los clientes en los que el usuario ha iniciado sesión. Además, AD FS realiza el intento más favorable de enviar la solicitud de cierre de sesión en el LogoutUriregistrado. El cliente debe implementar lógica para controlar la solicitud y tomar medidas para cerrar la sesión del usuario desde la aplicación.

P: Si, después del cierre de sesión, uno de los clientes vuelve a AD FS con un token de actualización válido, ¿AD FS emite un token de acceso?
R: Sí. Es responsabilidad de la aplicación cliente quitar todos los artefactos autenticados después de recibir una solicitud de cierre de sesión en el LogoutUri registrado.

Pasos siguientes

Desarrollo de AD FS