繁體中文(香港)
  • OIDC
  • SSO
  • 身份驗證

實施 OIDC 登出和會話管理:完整指南

深入探索 OIDC 認證和會話管理。學習如何實現由 RP 發起、IdP 發起和後台通道的 OIDC 登出,以安全地處理會話。

Simeng
Simeng
Developer

什麼是 OIDC 會話管理

OpenID Connect (OIDC) 是基於 OAuth 2.0 協議構建的一個簡單身份層。它允許客戶端基於授權伺服器執行的認證來驗證終端用戶的身份,並以互操作和類似 REST 的方式獲取有關終端用戶的基本配置文件信息。

OIDC 的設計重點是簡單易用和靈活實施,廣泛用於 Web 應用程序、手機應用程序和 API 的單一登入 (SSO) 和身份驗證。

了解 OIDC 中的認證狀態和會話管理至關重要。本文解釋了在身份提供者 (IdP) 和依賴方 (RP) 或服務提供者 (SP) 之間的交互中如何管理 OIDC 會話和用戶認證狀態。

本文包含一些關鍵術語。

  • 身份提供者 (IdP):存儲和認證用戶身份的服務。
  • 服務提供者 (SP) 或依賴方 (RP):提供用戶服務並依賴 IdP 進行用戶身份驗證的 Web 應用程序或服務。
  • 登入會話認證會話:用戶登錄到 IdP 時建立的會話。
  • 授權:由 IdP 生成和管理的集中用戶驗證和授權資訊。
  • 單一登入 (SSO):允許用戶使用一組登錄憑據(例如,姓名和密碼)訪問多個應用的會話和用戶認證服務。

OIDC 認證流程如何運作

為了更好地理解 OIDC 會話和用戶認證狀態管理,我們來簡單回顧一下用於 Web 應用的 OIDC 認證流程:

  1. 用戶訪問 Web 應用程序 (RP)。
  2. RP 將用戶重定向到 OIDC 提供者 (IdP) 進行身份驗證
  3. OIDC 提供者檢查用戶的登入會話狀態。如果不存在會話或會話已過期,將提示用戶登錄。
  4. 用戶與登錄頁面交互以完成身份驗證。
  5. 登錄頁面將交互結果提交給 OIDC 提供者。
  6. OIDC 提供者為用戶創建新的登入會話和認證授權。
  7. OIDC 提供者將用戶重定向回 RP,並附上認證代碼(授權碼流程)。
  8. RP 接收認證代碼並交換以獲取訪問用戶資訊的令牌。

什麼是 RP 登入會話管理

當用戶登錄到 IdP 時會制定一個登入會話。該會話用於跟踪用戶在 IdP 的認證狀態。會話通常包括用戶身份、認證時間和會話過期時間等信息。它是在用戶首次登錄時創建,並持續至用戶登出或會話過期。

會在用戶的瀏覽器中安全地設置會話 cookie 以保持會話狀態。會話 cookie 用於識別用戶的會話和對後續認證請求進行用戶驗證。此 cookie 通常設置為 HttpOnlySecure 標志以防止客戶端訪問並確保安全通信。

單一 RP 的一個會話

對於用戶從不同設備或瀏覽器訪問的每個 RP,將建立一個單獨的用戶登入會話。這意味著用戶的認證狀態會分別維護在每個 RP 上。如果用戶從一個 RP 登出,那麼在其他 RP 上的認證狀態將會保持至會話過期或用戶登出所有 RP。

多個 RP 的集中式會話

這種集中式會話管理還允許 IdP 在多個 RP 之間維持一致的認證狀態,只要用戶的會話是活躍的,並且身份驗證請求來自同一用戶代理(設備/瀏覽器)。該機制使得 SSO 功能成為可能,用戶可以在多個 RP 之間訪問而無需再次登錄。

客戶端的認證狀態

在 OIDC 中,客戶端應用程序 (RP) 依賴於 IdP 發出的令牌來驗證用戶的身份和認證或授權狀態。客戶端的 "登入會話" 由 IdP 發出的令牌維護。

  • ID Token:一個短期令牌,包含用戶信息,用於驗證已認證用戶的身份。
  • Access Token:一個授權代表用戶訪問受保護資源的令牌。存取令牌的壽命可以是短期或長期的,具體取決於配置。客戶端應用程序可以依賴存取令牌的有效性來確定用戶的認證狀態。如果存取令牌已過期或已被清除,用戶可能會被視為 "登出" 或 "未認證" 並需要重新認證。
  • Refresh Token:如果 offline_access 範圍被請求和授予,客戶端應用程序可能會接收到刷新令牌。它提供了一種在不需要用戶重新認證的情況下擴展用戶認證狀態的手段。客戶端應用可以使用刷新令牌在當前存取令牌過期時獲取新的存取令牌。只要刷新令牌仍然有效,用戶的認證狀態可以在不需要用戶交互的情況下維持。

這些令牌的組合允許客戶端應用程序維持用戶的認證狀態並代表用戶訪問受保護資源。客戶端應用程序需要安全地存儲這些令牌並管理它們的生命週期。(例如,對於 SPA 應用,令牌可以存儲在瀏覽器的本地存儲或會話存儲中。對於 Web 應用,令牌可以存儲在服務器端的會話數據或 cookies 中。)

OIDC 登出機制

由於涉及到集中式 IdP 管理的登入會話和分散的客戶端令牌,OIDC 的登出過程是多方面的概念。

清除客戶端的令牌和本地會話

在客戶端登出或撤銷用戶的認證狀態相對簡單。客戶端應用程序可以移除存儲在瀏覽器或內存中的令牌(ID 令牌、存取令牌、刷新令牌)。這一操作有效地使用戶在客戶端的認證狀態失效。

對於管理自己用戶登入會話的 Web 應用,可能需要額外的步驟。這包括清除會話 cookie 和任何會話數據(例如,身份提供者或 IdP 發行的令牌)以確保用戶完全登出。

清除 IdP 的集中登入會話

IdP 保持每個用戶的集中登入會話。只要會話還是活躍的, 即使客戶端令牌已清除,用戶可能仍會被自動重新認證,允許新令牌發放給客戶端應用,而不需要與 IdP 進一步交互。

若要將用戶完全登出 IdP,客戶端應用程序 (RP) 可以向 IdP 發起登出請求。應用程序 (RP) 應將用戶重定向到 IdP 的 end-session endpoint 來終止登入會話並清除會話 cookies。這確保在共享相同集中式會話的所有應用程序 (RPs) 中的完全登出。一旦登入會話終止,不論何時 IdP 接收到來自任何共享相同會話的 RPs 的令牌請求,將提示用戶重新認證。

OIDC 後台通道登出

在某些情況下,當用戶從一個應用程序 (RP) 登出時,可能希望自動地從所有其他應用程序 (RPs) 登出,而不需要額外的用戶交互。這可以使用後台通道登出機制來實現。

當 IdP 從一個 RP 收到登出請求時,它不僅會清除登錄會話,還會向使用相同會話並有註冊後台通道登出端點的所有 RPs 发送一个后端登出通知。

当 RPs 接收到后台通道登出通知时,可以执行必要的操作来清除用户的会话和令牌,确保用户完全从所有应用程序中登出。