使用 AD FS 的 OpenID Connect 單一登出

概觀

以 Windows Server 2012 R2 中 AD FS 的初始 Oauth 支援為基礎,AD FS 2016 引進了 OpenId Connect 登入的支援。 透過 KB4038801,AD FS 2016 目前對於 OpenId Connect 案例支援單一登出。 本文提供 OpenId Connect 案例的單一登出概觀,並提供如何在 AD FS 中將其用於 OpenId Connect 應用程式的指引。

探索文件

OpenID Connect 使用稱為「探索文件」的 JSON 文件來提供設定的詳細資料。 這包括驗證、權杖、userinfo 和公用端點的 URI。 以下是探索文件的範例。

{
"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
}

探索文件中將提供下列其他值,以指出支援 Front Channel Logout:

  • frontchannel_logout_supported:值為 'true'
  • frontchannel_logout_session_supported:值為 'true'。
  • end_session_endpoint:這是用戶端可用來在伺服器上起始登出的 OAuth 登出 URI。

AD FS 伺服器設定

預設會啟用 AD FS 屬性 EnableOAuthLogout。 此屬性會告知 AD FS 伺服器使用 SID 瀏覽 URL (LogoutURI),以在用戶端起始登出。 如果您未安裝 KB4038801,您可以使用下列 PowerShell 命令:

Set-ADFSProperties -EnableOAuthLogout $true

注意

安裝 KB4038801 之後,EnableOAuthLogout 參數會標記為過時。 EnableOAUthLogout 一律為 true,且不會影響登出功能。

注意

只有在安裝 KB4038801 之後,才支援 frontchannel_logout

用戶端組態

用戶端必須實作 URL,以「登出」登入的使用者。 管理員可以使用下列 PowerShell Cmdlet,在用戶端設定中設定 LogoutUri。

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

LogoutUri 是 AF FS 用來「登出」使用者的 url。 若要實作 LogoutUri,用戶端必須確定它會清除應用程式中使用者的驗證狀態,例如,卸載其擁有的驗證權杖。 AD FS 會瀏覽至該 URL,並將 SID 當做查詢參數,向信賴憑證者/應用程式發出登出使用者的訊號。

AD FS log off user diagram

  1. 具有工作階段識別碼的 OAuth 權杖:AD FS 會在發行 id_token 權杖時,在 OAuth 權杖中包含工作階段識別碼。 AD FS 稍後會使用此識別碼來識別要為使用者清除的相關 SSO Cookie。
  2. 使用者在 App1 起始登出:使用者可以從任何登入的應用程式起始登出。 在此範例案例中,使用者會從 App1 起始登出。
  3. 應用程式將登出要求傳送至 AD FS:在使用者起始登出之後,應用程式會將 GET 要求傳送至 AD FS 的 end_session_endpoint。 應用程式可以選擇性地包含 id_token_hint 作為此要求的參數。 如果 id_token_hint 存在,AD FS 會將其與工作階段識別碼搭配使用,以找出用戶端在登出後應重新導向至哪些 URI (post_logout_redirect_uri)。 post_logout_redirect_uri 應該是使用 RedirectUris 參數向 AD FS 註冊的有效 URI。
  4. AD FS 將登出傳送至登入的用戶端:AD FS 會使用工作階段識別碼值來尋找使用者登入的相關用戶端。 識別的用戶端會在向 AD FS 註冊的 LogoutUri 上傳送要求,以在用戶端起始登出。

常見問題集

問:我在探索文件中看不到 frontchannel_logout_supported 和 frontchannel_logout_session_supported 參數。
答:確定您已在所有 AD FS 伺服器上安裝 KB4038801。 請透過 KB4038801 參閱 Server 2016 中的單一登出。

問:我已將單一登出設定為已導向,但使用者會在其他用戶端保持登入。
答:確定已針對使用者登入的所有用戶端設定 LogoutUri。 此外,AD FS 會嘗試在已註冊的 LogoutUri 上傳送登出要求。 用戶端必須實作邏輯來處理要求,並採取動作從應用程式登出使用者。

問:登出之後,其中一個用戶端會回到具備有效重新整理權杖的 AD FS,AD FS 是否會發出存取權杖?
答:會。 用戶端應用程式有責任在註冊的 LogoutUri 收到登出要求之後,卸載所有已驗證的成品。

後續步驟

AD FS 開發