OIDC 会话管理
本文解释了在 IdP 和 SP 之间的交互上下文中如何管理 OIDC 会话和用户身份验证状态。
什么是 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 身份验证流程:
- 用户访问 Web 应用程序 (RP)。
- RP 将用户重定向到 OIDC 提供者 (IdP) 进行 身份验证。
- OIDC 提供者检查用户的登录会话状态。如果不存在会话或会话已过期,则提示用户登录。
- 用户与登录页面交互进行身份验证。
- 登录页面将交互结果提交给 OIDC 提供者。
- OIDC 提供者为用户创建一个新的登录会话和身份验证授权。
- OIDC 提供者将用户重定向回 RP,并带有一个身份验证代码 (授权代码流程)。
- RP 接收身份验证代码并将其交换为访问用户信息的令牌。
什么是 RP 登录会话管理
当用户登录到 IdP 时,会建立一个登录会话。该会话用于跟踪用户在 IdP 的身份验证状态。会话通常包括用户身份、身份验证时间和会话过期时间等信息。它在用户首次登录时创建,并在用户注销或会话过期之前保持。
将在用户浏览器中安全地设置一个会话 Cookie 以维护会话状态。会话 Cookie 用于标识用户的会话并对后续的身份验证请求进行身份验证。此 Cookie 通常带有 HttpOnly
和 Secure
标志,以防止客户端访问并确保安全通信。
单个 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 的令牌请求时,将提示用户重新认证。
OIDC 后端登出
在某些情况下,当用户从一个应用程序 (RP) 注销时,他们可能希望自动从所有其他应用程序 (RP) 注销,而无需任何额外的用户交互。这可以通过 后端登出 机制来实现。
当 IdP 接收到来自 RP 的注销请求时,它不仅清除了登录会话,还会向所有使用同一会话并注册了后端登出端点的 RP 发送后端登出通知。
当 RP 接收到后端登出通知时,它们可以执行必要的操作以清除用户的会话和令牌,确保用户完全从所有应用程序中注销。