使用 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 當作查詢參數,向信賴方和應用程式發出註銷使用者的訊號。
- 帶有會話 ID 的 OAuth 令牌:AD FS 在發行 id_token 令牌時,會在 OAuth 令牌中包含會話 ID。 AD FS 稍後會使用此標識碼來識別要為使用者清除的相關 SSO Cookie。
- 使用者起始 App1的註銷:使用者可以從任何登入的應用程式起始註銷。 在此範例案例中,使用者從 App1 登出。
- 應用程式會將登出要求傳送至 AD FS:在使用者起始登出之後,應用程式會將 GET 要求傳送至 AD FS 的 end_session_endpoint。 應用程式可以選擇性地包含id_token_hint做為此要求的參數。 如果 id_token_hint 存在,AD FS 會將其與會話 ID 搭配使用,以確定註銷後用戶端應重新導向至的 URI(post_logout_redirect_uri)。 post_logout_redirect_uri應該是使用 RedirectUris 參數向 AD FS 註冊的有效 URI。
- AD FS 會將註銷傳送至登入的用戶端:AD FS 會使用會話標識符值來尋找使用者登入的相關用戶端。 已識別的客戶端會在向 AD FS 註冊的 LogoutUri 上發送請求,以啟動客戶端的登出。
常見問題
問: 我在探索檔中看不到 frontchannel_logout_supported 和 frontchannel_logout_session_supported 參數。
答: 確定您已在所有 AD FS 伺服器上安裝 KB4038801。 請參閱 Server 2016 中的單一登出,KB4038801。
問: 我已按照指示設定單一註銷,但使用者仍然在其他用戶端保持登入。
A: 確定已針對使用者登入的所有用戶端設定 LogoutUri
。 此外,AD FS 會在最佳情況下嘗試在已註冊的 LogoutUri
上發送登出請求。 用戶端必須實作邏輯來處理要求,並採取動作從應用程式註銷使用者。
問: 註銷之後,其中一個用戶端是否會返回至 AD FS 並使用有效的重新整理令牌,AD FS 是否會發出存取令牌?
A: 是。 客戶端應用程式有責任在註冊的 LogoutUri
收到註銷請求後刪除所有已驗證的憑證。