实现 OIDC 注销和会话管理:完整指南
深入探索 OIDC 认证和会话管理。了解如何实现 OIDC RP 发起、IdP 发起和后端通道注销以安全处理会话。
什么是 OIDC 会话管理
OpenID Connect (OIDC) 是一个基于 OAuth 2.0 协议构建的简单身份层。它允许客户端根据授权服务器进行的认证验证终端用户的身份,以及以互操作和类 REST 的方式获取关于终端用户的基本个人资料信息。
OIDC 旨在易于使用和实现,重点在于简单性和灵活性。它广泛应用于网络应用、移动应用和 API 中的单点登录 (SSO) 和身份验证。
理解 OIDC 中的认证状态和会话管理至关重要。本文解释了 OIDC 会话和用户认证状态在身份提供者 (IdP) 和依赖方 (RP) 或服务提供者 (SP) 之间的交互环境下是如何管理的。
本文包括几个关键术语。
- 身份提供者 (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 用于识别用户的会话,并在后续的认证请求中对用户进行认证。这个 cookie 通常使用 HttpOnly
和 Secure
标记设置,以防止客户端访问并确保安全的通信。
单 RP 的单会话
对于用户从不同设备或浏览器访问的每个 RP,将分别建立一个用户登录会话。这意味着用户的认证状态对每个 RP 是独立维护的。如果用户从一个 RP 注销,其他 RP 上的用户仍将被认证,直到会话过期或用户从所有 RP 注销为止。
多 RP 的中心化会话
这种中心化的会话管理还允许 IdP 在用户会话活跃且认证请求来自同一个用户代理设备/浏览器的情况下,保持多个 RP 之间的一致认证状态。此机制启用了 SSO 功能,用户能在无需再次登录的情况下访问多个 RP。
客户端认证状态
在 OIDC 中,客户端应用程序 (RP) 依靠 IdP 发放的令牌来验证用户的身份和认证或授权状态。客户端的“登录会话”由 IdP 颁发的令牌维护。
- ID 令牌:一种短期有效的令牌,包含用户信息,用于验证认证用户的身份。
- 访问令牌:一种令牌,代表用户授予对受保护资源的访问权限。访问令牌的生命周期可以是短期或长期的,具体取决于配置。客户端应用程序可以根据访问令牌的有效性来决定用户的认证状态。如果访问令牌已过期或被清除,用户可能被视为“已注销”或“未认证”,需要重新认证。
- 刷新令牌:当请求并授予
offline_access
范围时,客户端应用程序可能会收到刷新令牌。它提供了一种在不需要用户重新认证的情况下扩展用户认证状态的方式。客户端应用程序可以在当前访问令牌过期时使用刷新令牌获取新访问令牌。只要刷新令牌有效,就可以保持用户的认证状态而无需用户交互。
这些令牌的组合允许客户端应用程序维护用户的认证状态,并代表用户访问受保护资源。客户端应用程序需要安全地存储这些令牌并管理它们的生命周期。(例如,对于 SPA 应用程序,可以将令牌存储在浏览器的本地存储或会话存储中。对于网络应用程序,可以在服务器端会话数据或 cookie 中存储令牌。)
OIDC 注销机制
OIDC 中的注销过程由于涉及中心化 IdP 管理的登录会话和分布于客户端的令牌而成为一个多方面的概念。
清除客户端的令牌和本地会话
在客户端注销或撤销用户认证状态相对简单。客户端应用程序可以从用户的浏览器或内存中移除存储的令牌(ID 令牌、访问令牌和刷新令牌)。此操作有效地使用户在客户端的认证状态无效。
对于管理自己用户登录会话的网络应用程序,可能需要额外的步骤。这些步骤包括清除会话 cookie 和任何会话数据(例如由身份提供者或 IdP 发放的令牌)以确保用户完 全注销。
清除 IdP 的中心化登录会话
IdP 为每个用户维护一个中心化的登录会话。只要这个会话是活跃的,即使客户端令牌被清除,用户也可能被自动重新认证,允许无进一步与 IdP 交互而向客户端应用程序颁发新令牌。
为了完全注销一个用户来自 IdP,客户端应用程序(RP)可以发起一个注销请求到 IdP。应用程序(RP)应将用户重定向到 IdP 的结束会话端点以终止登录会话并清除会话 cookie。这确保了共享相同中心化会话的所有应用程序(RPs)之间的完全注销。一旦登录会话被终止,当 IdP 接收到来自共享相同会话任一已链接 RP 的令牌请求时,IdP 将提示用户进行重新认证。
OIDC 后端通道注销
在某些情境下,当用户从一个应用程序(RP)注销时,他们可能希望在无需任何额外用户交互的情况下自动从所有其他应用程序(RP)中注销。这可以通过使用 后端通道注销 机制完成。
当 IdP 从某个 RP 收到注销请求时,它不仅会清除登录会话,还会向所有使用相同会话并注册了后端注销端点的 RP 发送一个后端通道注销通知。
当 RPs 接收到后端注销通知时,它们可以执行必要的操作以清除用户的会话和令牌,确保用户已完全从所有应用程序中注销。