繁體中文(台灣)
  • OIDC
  • SSO
  • authentication

OIDC 會話管理

本文解釋了在 IdP 和 SP 之間互動的背景下,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 令牌:一個包含用戶資訊的短期令牌,用於驗證用戶的身份。
  • 訪問令牌:代表用戶授予對受保護資源的訪問權限的令牌。訪問令牌的存活時間可以是短期或長期的,取決於配置。客戶端應用程式可能會依賴訪問令牌的有效性來確定用戶的驗證狀態。如果訪問令牌過期或被清除,用戶可能被視為 "已登出" 或 "未驗證",需要重新驗證。
  • 刷新令牌:如果請求並授予了 offline_access 範圍,則客戶端應用程式可能會接收刷新令牌。它提供了一種在不要求用戶重新驗證的情況下擴展用戶驗證狀態的方法。客戶端應用程式可以在當前訪問令牌到期時使用刷新令牌獲取新訪問令牌,只要刷新令牌有效,用戶的驗證狀態可以在不需要用戶互動的情況下持續維持。

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

OIDC 登出的機制

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

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

要在客戶端上登出或撤銷用戶的驗證狀態相對簡單。客戶端應用程式可以從用戶的瀏覽器或記憶體中移除存儲的令牌(ID 令牌、訪問令牌和刷新令牌)。此操作有效地使用戶在客戶端的驗證狀態失效。

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

清除 IdP 的集中登入會話

IdP 為每位用戶維持一個集中登入會話。只要此會話處於活動狀態,即使客戶端令牌已被清除,用戶也可能被自動重新驗證,允許向客戶端應用程式發放新令牌,而無需進一步與 IdP 互動。

為了從 IdP 完全登出用戶,客戶端應用程式 (RP) 可以向 IdP 發出登出請求。應用程式 (RP) 應將用戶重定向到 IdP 的 會話結束端點 以終止登入會話並清除會話 Cookie。這確保了共享相同集中會話的所有應用程式 (RP) 的完全登出。一旦登入會話終止,每當 IdP 收到共享相同集中會話的任何連結 RP 的令牌請求時,IdP 將提示用戶重新驗證。

OIDC 後端登出

在某些情況下,當用戶從一個應用程式 (RP) 登出時,他們可能希望在不需要任何額外用戶互動的情況下自動從所有其他應用程式 (RP) 登出。這可以使用 後端登出 機制完成。

當 IdP 收到來自 RP 的登出請求時,它不僅清除登入會話,還向所有使用相同會話並註冊了後端登出端點的 RP 發送後端登出通知。

當 RP 接收到後端登出通知時,它們可以執行必要的操作以清除用戶的會話和令牌,確保用戶從所有應用程式中完全登出。