Disconnessione singola per OpenID Connect con AD FS
Panoramica
Basandosi sul supporto Oauth iniziale in AD FS in Windows Server 2012 R2, AD FS 2016 ha introdotto il supporto per l'accesso a OpenId Connect. Con KB4038801, AD FS 2016 supporta ora una singola disconnessione per scenari OpenId Connect. Questo articolo offre una panoramica del singolo log-out per lo scenario OpenId Connect e fornisce indicazioni su come usarlo per le applicazioni OpenId Connect in AD FS.
Documento di individuazione
OpenID Connect usa un documento JSON denominato "Documento di individuazione" per fornire informazioni dettagliate sulla configurazione. Sono inclusi gli URI dell'autenticazione, del token, dell'id utente e degli endpoint pubblici. Di seguito è riportato un esempio del documento di individuazione.
{
"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
}
I seguenti valori aggiuntivi saranno disponibili nel documento di individuazione per indicare il supporto del Logout del canale anteriore:
- frontchannel_logout_supported: il valore sarà "true"
- frontchannel_logout_session_supported: il valore sarà "true".
- end_session_endpoint: si tratta dell'URI di disconnessione OAuth che il client può usare per avviare la disconnessione nel server.
Configurazione del server AD FS
La proprietà AD FS EnableOAuthLogout verrà abilitata per impostazione predefinita. Questa proprietà indica al server AD FS di cercare l'URL (LogoutURI) con il SID per avviare la disconnessione nel client. Se non è installato KB4038801 è possibile usare il comando PowerShell seguente:
Set-ADFSProperties -EnableOAuthLogout $true
Nota
EnableOAuthLogout
il parametro verrà contrassegnato come obsoleto dopo l'installazione di KB4038801. EnableOAUthLogout
sarà sempre true e non avrà alcun impatto sulla funzionalità di disconnessione.
Nota
frontchannel_logout è supportato solo dopo l'installazione di KB4038801
Configurazione del client
Il client deve implementare un URL che "disconnette" l'utente connesso. L'amministratore può configurare LogoutUri nella configurazione client usando i cmdlet di PowerShell seguenti.
(Add | Set)-AdfsNativeApplication
(Add | Set)-AdfsServerApplication
(Add | Set)-AdfsClient
Set-AdfsClient -LogoutUri <url>
LogoutUri
è l'URL usato da AF FS per "disconnettere" l'utente. Per implementare LogoutUri
, il client deve assicurarsi che cancelli lo stato di autenticazione dell'utente nell'applicazione, ad esempio eliminando i token di autenticazione di cui dispone. AD FS passerà a tale URL, con il SID come parametro di query, segnalando alla relying party/applicazione di disconnettere l'utente.
- Token OAuth con ID sessione: AD FS include l'ID sessione nel token OAuth al momento del rilascio del token id_token. Questa operazione verrà usata successivamente da AD FS per identificare i cookie SSO pertinenti da pulire per l'utente.
- L'utente avvia la disconnessione in App1: l'utente può avviare una disconnessione da una qualsiasi delle applicazioni registrate. In questo scenario di esempio, un utente avvia una disconnessione da App1.
- L'applicazione invia una richiesta di disconnessione ad AD FS: dopo che l'utente ha avviato la disconnessione, l'applicazione invia una richiesta GET a end_session_endpoint di AD FS. L'applicazione può facoltativamente includere id_token_hint come parametro per questa richiesta. Se id_token_hint è presente, AD FS lo userà insieme all'ID sessione per determinare quale URI deve essere reindirizzato al client dopo la disconnessione (post_logout_redirect_uri). Il post_logout_redirect_uri deve essere un URI valido registrato con AD FS usando il parametro RedirectUris.
- AD FS invia la disconnessione ai client connessi: AD FS usa il valore dell'identificatore di sessione per trovare i client pertinenti a cui l'utente è connesso. I client identificati vengono inviati alla richiesta sul LogoutUri registrato con AD FS per avviare una disconnessione sul lato client.
Domande frequenti
Q: non vengono visualizzati i parametri frontchannel_logout_supported e frontchannel_logout_session_supported nel documento di individuazione.
A: Assicurarsi di aver installato KB4038801 in tutti i server AD FS. Fare riferimento a Disconnessione singola in Server 2016 con KB4038801.
Q: la disconnessione singola è stata configurata come indicato, ma l'utente rimane connesso ad altri client.
A: Assicurarsi che LogoutUri
sia impostato per tutti i client in cui è connesso l'utente. AD FS tenta inoltre di inviare la richiesta di disconnessione nel LogoutUri
registrato. Il client deve implementare la logica per gestire la richiesta e intervenire per disconnettere l'utente dall'applicazione.
Q: Se dopo la disconnessione uno dei client torna ad AD FS con un token di aggiornamento valido, AD FS emetterà un token di accesso?
A: Sì. È responsabilità dell'applicazione client eliminare tutti gli artefatti autenticati dopo che è stata ricevuta una richiesta di disconnessione al LogoutUri
registrato.