Compartir a través de


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

Información general

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. Con 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 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.

Documento de detección

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. Si no tiene KB4038801 instalado, puede usar el siguiente comando de PowerShell:

Set-ADFSProperties -EnableOAuthLogout $true

Nota:

EnableOAuthLogout el parámetro se marcará como obsoleto después de instalar KB4038801. EnableOAUthLogout siempre será verdadero y no tendrá ningún impacto en la funcionalidad de cerrar sesión.

Nota:

frontchannel_logout solo se admite después de la instalación de 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 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.

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 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.

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 emitirá un token de acceso?
Un: 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 registrado LogoutUri.

Pasos siguientes

Desarrollo de AD FS