dho*_*ton 5 single-sign-on oauth-2.0 single-page-application openid-connect
我目前正在使用 OIDC 在多个应用程序上实施 SSO。我不确定如何在单页应用程序 (SPA) 中处理单点注销以进行基于令牌的身份验证。
考虑两个应用程序。应用 A 是使用 OAuth2 授权代码流的标准 Spring MVC 应用,应用 B 是使用隐式流的 SPA。如果用户已登录应用程序 A,则当他们导航到应用程序 B 时,他们会通过 SSO 自动登录,这是意料之中的。但是,如果用户退出应用程序 A 然后导航到应用程序 B,当前应用程序 B 仍会加载并允许访问 apis,因为它具有存储在浏览器本地存储中的有效 OAuth2 访问令牌。我希望应用程序 B 在提出任何其他请求之前要求用户重新进行身份验证。
在 SPA 中进行单点注销的推荐方法是什么,因为无法让身份提供者向服务器端点发送“注销”请求?
我想到的几个可能的解决方案是:
我对使用这两种解决方案中的任何一种都犹豫不决,因为它们需要在用户与应用程序交互时向 IDP 发出额外请求。有没有其他策略可以解决这个问题?
编辑
感谢 sdoxsee 的回答,这使我们需要更多的澄清。我应该提到退出应用程序 A 或应用程序 B 也会使用户退出 IDP 会话。但是,由于应用程序 B 在浏览器本地存储中具有有效的访问令牌,因此当用户导航到应用程序 B 时,尽管没有活动的 IDP 会话,他们仍将“登录”到应用程序 B。希望这能提供更多说明。
除非您退出 IDP,否则即使您结束客户端会话,您也会自动重新登录到客户端应用程序中。您必须结束 IDP(或 OP)会话。即,如果您未注销 Google 地图、YouTube、Google 云端硬盘,也不会通过注销您的 Google 帐户 (IDP/OP) 来注销 Gmail。使用 oidc 注销(我见过的实现)的最常见方法在实现草案中捕获:http://openid.net/specs/openid-connect-session-1_0.html#RPLogout
笔记。这不是 oidc 规范本身的一部分,因此 OP 实现可能没有这个。
根据编辑的问题进行更新:
dhouston,据我了解,您不能简单地注销 RP(客户端)和 OP(身份提供者),而是注销在 OP 会话期间使用 OP 登录的所有RP。这比较棘手,但也有一份草案是建立在我之前提到的草案的基础上的。http://openid.net/specs/openid-connect-frontchannel-1_0.html。
警告:我自己还没有尝试过。基本思想是,OP 跟踪已通过其会话登录的 RP 列表,并启动每个 RP 的注销。同样,这不在 OIDC 规范中,但遵循实施草案可能比推出自己的策略更明智。
可能还有其他实施草案可以解决此问题,因此如果这个没有帮助,请搜索更多内容(参考这个),因为可能会与其他选项进行比较。
| 归档时间: |
|
| 查看次数: |
1353 次 |
| 最近记录: |