OIDC 會話管理
本文解釋了在 IdP 與 SP 之間交互中如何管理 OIDC 會話和用戶身份驗證狀態。
什麼是 OIDC 會話管理
OpenID Connect (OIDC) 是一個建立在 OAuth 2.0 協議之上的簡單身份層。它允許客戶端根據授權服務器進行的身份驗證來驗證終端用戶的身份,並以互操作的和類似 REST 的方式獲取有關終端用戶的基本個人信息。
OIDC 被設計為易於使用和實施,著重於簡單性和靈活性。它廣泛用於網頁應用、移動應用和 API 的單一登入 (SSO) 和身份驗證。
理解 OIDC 中的身份驗證狀態和會話管理至關重要。本文解釋了在 身份提供方 (IdP) 和信賴方 (RP) 或 服務提供方 (SP) 之間的交互中如何管理 OIDC 會話和用戶身份驗證狀態。
本文包含幾個關鍵術語。
- 身份提供方 (IdP):存儲和驗證用戶身份的服務。
- 服務提供方 (SP) 或信賴方 (RP):為用戶提供服務的網頁應用或服務,依賴於 IdP 進行用戶身份驗證。
- 登入會話 或 身份驗證會話:用戶登入 IdP 時建立的會話。
- 授權:由 IdP 生成和管理的集中式用戶身份驗證和授權信息。
- 單一登入 (SSO):允許用戶使用一組登錄憑證 (例如,名稱和密碼) 訪問多個應用的會話和用戶身份驗證服務。
OIDC 身份驗證流程如何運作
為了更好地了解 OIDC 會話和用戶 身份驗證狀態管理,我們簡要回顧一下 OIDC 用於網頁應用的身份驗證流程:
- 用戶訪問網頁應用 (RP)。
- RP 將用戶重定向到 OIDC 提供方 (IdP) 進行 身份驗證。
- OIDC 提供方檢查用戶的登入會話狀態。如果沒有會話或會話已過期,用戶將被提示登入。
- 用戶與登入頁面交互以進行身份驗證。
- 登入頁面將交互結果提交給 OIDC 提供方。
- OIDC 提供方為用戶創建一個新的登入會話和身份驗證授權。
- OIDC 提供方將用戶重定向回 RP,並附上身份驗證代碼 (授權碼流程)。
- RP 接收身份驗證代碼並將其兌換為可訪問用戶信息的令牌。
什麼是 RP 登入會話管理
當用戶登入 IdP 時,會建立一個登入會話。此會話用於跟踪用戶在 IdP 的身份驗證狀態。會話通常包含用戶身份、身份驗證時間和會話過期時間等信息。會在用戶首次登入時創建,並一直維持到用戶登出或會話過期為止。
為了維持會話狀態,會在用戶的瀏覽器中安全地設置會話 cookie。會話 cookie 用於識別用戶的會話並為後續的身份驗證請求進行身份驗證。通常設置 HttpOnly
和 Secure
標志,以防止客戶端訪問並確保安全通信。
單一 RP 的一個會話
對於用戶從不同設備或瀏覽器訪問的每個 RP,都會建立一個單獨的用戶登入會話。這意味著用戶的身份驗證狀態將為每個 RP 分別維護。如果用戶從一個 RP 登出,這個用戶仍會被其他 RP 認證,直到會話過期或用戶從所有 RP 登出。
多個 RP 的集中式會話
這種集中式會話管理還允許 IdP 在多個 RP 之間維持一致的身份驗證狀態,隨著用戶的會話保持活躍和身份驗證請求來自相同的用戶代理(設備/瀏覽器)。這種機制支持 SSO 功能,允許用戶訪問多個 RP 而無需再次登入。
客戶端的身份驗證狀態
在 OIDC 中,客戶端應用 (RP) 依賴 IdP 發出的令牌來驗證用戶的身份和身份驗證或授權狀態。客戶端的 "登入會話" 由 IdP 發出的令牌維持。
- ID 令牌:一種短期令牌,包含用戶信息,用於驗證已認證用戶的身份。
- 訪問令牌:授權用戶訪問受保護資源的令牌。訪問令牌的生命周期可以是短期或長期的,這取決於配置。客戶端可依賴訪問令牌的有效性來判斷用戶的身份驗證狀態。如果訪問令牌過期或被清除,可能會認為用戶 "已登出" 或 "未經認證",需要重新認證。
- 刷新令牌:如果請求並授予了
offline_access
范圍,客戶端應用可能會收到刷新令牌。它提供了一種延長用戶身份驗證狀態的方法,而不要求用戶重新認證。客戶端應用可使用刷新令牌在當前訪問令牌過期後獲取一個新訪問令牌。只要刷新令牌有效,用戶的身份驗證狀態可以維持而不需要用戶交互。
這些令牌的組合允許客戶端應用維持用戶的身份驗證狀態和代表用戶訪問受保護資源。客戶端應當安全地存儲這些令牌並管理其生命周期。(例如,對於單頁應用,令牌可以存儲在瀏覽器的本地存儲或會話存儲。對於網頁應用,令牌可以存儲在服務端的會話數據或 cookie 中。)
OIDC 退出機制
由於涉及到集中管理的 IdP 登入會話和分布式的客戶端令牌,OIDC 中的退出過程是一個多方面的概 念。
清除用戶端的令牌和本地會話
在用戶端退出或撤銷用戶身份驗證狀態相對簡單。客戶端可以從用戶的瀏覽器或內存中移除存儲的令牌(ID 令牌,訪問令牌和刷新令牌)。這一措施有效地使用戶在客戶端的身份驗證狀態失效。
對於自行管理用戶登入會話的網頁應用,可能需要額外步驟。這包括清除會話 cookie 及任何會話數據(如 IdP 發的令牌),以確保用戶完整登出。
清除 IdP 的集中式登入會話
IdP 為每位用戶維持一個集中式登入會話。只要此會話有效,即使客戶端令牌已被清除,用戶仍可能自動被重新認證,使新令牌可以發給客戶端,而無需與 IdP 進一步互動。
為了讓用戶完整地從 IdP 退出,客戶端應用 (RP) 可以向 IdP 發起退出請求。應用 (RP) 應將用戶重定向至 IdP 的 結束會話端點 以終止登入會話和清除會話 cookie,這可確保所有共享同一集中會話的應用 (RP) 完整登出。一旦登入會話被終止,當 IdP 接收到任何共享該會話的 RP 的令牌請求時,IdP 將提示用戶重新認證。
OIDC 後端通道退出
在某些情況下,當用戶從一個應用 (RP) 登出時,可能希望自動從所有其他應用 (RP) 退出,而不需要額外的用戶交互。這可以通過 後端通道退出 機制實現。
當 IdP 接收到來自 RP 的退出請求時,它不僅清除登入會話,還會 向所有使用相同會話並註冊了後端通道退出端點的 RP 發送後端通道退出通知。
當 RP 接收到這個通知時,應根據需要執行操作以清除用戶的會話和令牌,確保用戶從所有應用中完全退出。