Compartir a través de


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

Overview

Basándose en la compatibilidad inicial con Oauth en AD FS en Windows Server 2012 R2, AD FS 2016 introdujo la compatibilidad con el inicio de sesión de OpenId Connect. With KB4038801, AD FS 2016 now supports single log-out for OpenId Connect scenarios. En este artículo se proporciona información general sobre el escenario de cierre de sesión único para OpenId Connect y se proporcionan instrucciones sobre cómo usarlo para las aplicaciones de OpenId Connect en AD FS.

Discovery doc

OpenID Connect usa un documento JSON denominado "Documento de detección" para proporcionar detalles sobre la configuración. Esto incluye los URI de autenticación, token, userinfo y puntos de conexión públicos. A continuación se muestra un ejemplo del documento de descubrimiento.

{
"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 habilitará de forma predeterminada. Esta propiedad 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. If you do not have KB4038801 installed you can use the following PowerShell command:

Set-ADFSProperties -EnableOAuthLogout $true

Note

EnableOAuthLogout parameter will be marked as obsolete after installing KB4038801. EnableOAUthLogout siempre será verdadero y no tendrá ningún impacto en la funcionalidad de cerrar sesión.

Note

frontchannel_logout is supported only after installation of KB4038801

Client configuration

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 de cliente mediante 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 AF 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 navegará a esa dirección URL, con el SID como parámetro de consulta, señalizando a la parte confiable o aplicación que cierre la sesión del usuario.

Diagrama de usuario de cierre de sesión de AD FS

  1. Token de OAuth con ID de sesión: AD FS incluye el ID de sesión en el token de OAuth en el momento de la emisión del token id_token. AD FS usará esto más adelante para identificar las cookies de SSO pertinentes que se van a limpiar 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 ha 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 que el usuario inicie el cierre de sesión, 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 se debe redirigir el cliente después del cierre de sesión (post_logout_redirect_uri). El post_logout_redirect_uri debe ser un URI válido registrado con AD FS mediante 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 de 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.

FAQs

Q: I do not see the frontchannel_logout_supported and frontchannel_logout_session_supported parameters in the discovery doc.
A: Ensure that you have KB4038801 installed on all the AD FS servers. Refer to Single log-out in Server 2016 with KB4038801.

Q: I have configured single logout as directed, but user stays logged-in on other clients.
A: Ensure that LogoutUri is set for all the clients where the user is logged-in. Además, AD FS realiza el intento más favorable de enviar la solicitud de cierre de sesión en el registrado LogoutUri. El cliente debe implementar lógica para controlar la solicitud y tomar medidas para cerrar la sesión del usuario desde la aplicación.

Q: If after logout, one of the clients goes back to AD FS with a valid refresh token, will AD FS issue an access token?
A: Yes. 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 registrado LogoutUri.

Next Steps

Desarrollo de AD FS