OIDC Session SPA 管理 (Single-Sign-Out)

OIDC Session Management in a SPA (Single-Sign-Out)

我目前正在使用 OIDC 在多个应用程序上实施 SSO。我不确定如何在 Single-Page 应用程序 (SPA) 中处理 single-sign-out 以进行 token-based 身份验证。

考虑两个应用程序。应用程序 A 是使用 OAuth2 授权代码流程的标准 Spring MVC 应用程序,应用程序 B 是使用隐式流程的 SPA。如果用户已登录到应用程序 A,当他们导航到应用程序 B 时,他们将通过 SSO 自动登录,这是可以预料的。但是,如果用户退出应用程序 A 然后导航到应用程序 B,当前应用程序 B 仍会加载并允许访问 api,因为它在浏览器本地存储中存储了有效的 OAuth2 访问令牌。我希望应用程序 B 要求用户在发出任何其他请求之前 re-authenticate。

在 SPA 中进行单点注销的推荐方法是什么,因为无法让身份提供者向服务器端点发送 'signout' 请求?

我想到的几个可能的解决方案是:

  1. 创建 one-time-use 每个请求都必须 re-generated 的访问令牌。
  2. 每当应用程序 B 想要向我们的 API 发出请求时,检查活动 IDP session。

我犹豫要不要使用这两种解决方案中的任何一种,因为每当用户与应用程序交互时,它们都需要向 IDP 发出额外请求。还有其他解决这个问题的策略吗?

编辑

感谢 sdoxsee 的回答,让我们需要进一步澄清。我应该提到,退出应用程序 A 或应用程序 B 也会使用户退出 IDP session。然而,因为应用程序 B 在浏览器本地存储中有一个有效的访问令牌,当用户导航到应用程序 B 时,他们仍然 'signed in' 到应用程序 B 尽管 没有活动国内流离失所者 session。希望这能提供更多说明。

除非您退出 IDP,否则即使您结束客户端 session,您也会在客户端应用程序中自动重新登录。你必须结束 IDP(或 OP)session。也就是说,如果不注销 Google 地图、YouTube、Google 驱动器以及注销 Google 帐户 (IDP/OP),就不会注销 Gmail。最常见的使用 oidc 注销的方式(我已经看到实现)在一个实现草案中被捕获:http://openid.net/specs/openid-connect-session-1_0.html#RPLogout

注意。这不是 oidc 规范本身的一部分,因此 OP 实现可能没有这个。

根据已编辑的问题更新:

dhouston,据我了解,您不能简单地注销 RP(客户端)和 OP(身份提供者),而是 all 已签名的 RP在 OP session 期间与 OP 一起。这比较棘手,但也有一个草案是建立在我之前提到的草案之上的。 http://openid.net/specs/openid-connect-frontchannel-1_0.html

警告:我自己还没有尝试过。基本思想是 OP 跟踪已通过其 session 登录的 RP 列表,并启动每个 RP 的注销。同样,这不在 OIDC 规范中,但遵循实施草案可能比推出自己的策略更明智。

可能还有其他实施草案来解决这个问题,所以如果这个没有帮助,请搜索更多(参考这个)因为可能会与其他选项进行比较。