如何在基于JWT的单点登录身份验证体系结构中实现Logout?

ele*_*ype 9 authentication single-sign-on jwt openid-connect

我试图了解如何使用Json Web Tokens在单点登录架构中实现注销功能.

假设我们有:

  • example1.com
  • example2.com
  • authserver.com

当用户必须进行身份验证时example1.com,会将authserver.com其重定向到验证用户凭据,创建已签名的JWT令牌并example1.com使用此令牌将用户重定向回.example1.com然后将设置一个cookie(或LocalStorage密钥),并且example1.com只要该令牌未过期,就会对用户进行身份验证.无需更多呼叫即可authserver.com识别用户.

然后用户前往example2.com参与SSO体系结构.用户也需要在那里进行身份验证,因此example2.com还要将用户重定向到authserver.com识别用户的用户(使用第一次设置的cookie),创建新的JWT令牌并自动将用户重定向回example2.com.example2.com然后将设置一个cookie(或LocalStorage密钥),并且example2.com只要该令牌未过期,就会对用户进行身份验证.无需更多呼叫即可authserver.com识别用户.

现在,如何实施"注销"功能?

如果用户注销example1.com,example1.com则会删除JWT令牌,并且不再对用户进行身份验证.但是当他试图到达受保护区域时,example1.com会将其重定向到authserver.com,用户将被识别并再次自动登录...即使他刚刚退出!

Quetion 1)所以我想当用户注销时example1.com,authserver.com必须进行调用才能删除设置的cookie,authserver.com这样用户就不会再自动登录了?

排队2)如果是这样,那该怎么example2.com办?用户是否还应该在那里进行身份验证?如果没有,建议的流程是example2.com什么,因此知道它对用户的JWT令牌不再有效?

ped*_*ofb 7

或者,您也可以在没有openid的情况下实现跨域SSO,仅在客户端使用JWT,例如google web apps.

优点是您无需将用户重定向到服务器以了解用户是否已登录.可以在选项卡之间自动同步Logout和JWT更改.

在Authserver.com将JWT返回到example1之后,将其存储在localStorage中,但通过iframe使用中间域sso.example.com.在example1和example2中包含此iframe(指向sso.example.com).iframe将读取JWT并向包含令牌的页面发送消息.

当用户注销或更改活动用户时,iframe也可以向父级发送消息,因此您可以同步所有站点(如果需要)

CORS没问题,因为sso.example.com可以访问其localStorage.如果识别出原点和目的地,则允许iframe之间的通信(请参阅http://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage)

为了简化开发,我们最近发布了一个带有JWT的跨域SSO,网址https://github.com/Aralink/ssojwt

将您的问题总结为此架构1)在localStorage中清理JWT并发送javascript事件2)听取事件并决定做什么


sdo*_*see 5

1) https://openid.net/specs/openid-connect-session-1_0.html#RPLogout是一种规范(对于不同的策略还有其他规范),也可以退出 authserver。它定义了end_session_endpoint您的 example1.com 将重定向到的;请注意,authserver 将用户注销并可以重定向回 RP 的post_logout_redirect_uri.

2)我认为这取决于你想要它做什么。您可能不想终止 example2.com 会话,在这种情况下 example2.com 会继续。example2.com 的 JWT 仍然有效。如果您想注销所有客户端,这有点复杂,但可能。在我的项目中,我们想要注销一个客户端和 authserver。

  • 一个 OP 实现 IdentityServer3 (https://identityserver.github.io/Documentation/docsv2/endpoints/endSession.html) 仅在您同时提供 JTW 和 post_logout_redirect_uri 时重定向到客户端。如果一切正常,您甚至都不会看到 OP。还有其他规范可以做类似的事情(实际上 IdentityServer3 昨天刚刚实现了另一个规范:http://openid.net/specs/openid-connect-logout-1_0.html)但诀窍是 OP 上的浏览​​器 cookie 需要被清除......我想不出你会如何在不参加 OP 的情况下做到这一点) (2认同)
  • 我猜对 OP 的后端调用可能会使与用户 cookie 关联的“会话”无效,因此该 cookie 不再有效而不会被删除。但我同意,如果它是快速重定向/重定向回来,那没关系。我问是因为您发布的 OpenID 规范指出:`在注销端点,OP 应该询问最终用户他是否也想注销 OP。如果最终用户说“是”,则 OP 必须注销最终用户。`。但这是*应该*而不是*必须*,所以我想自动注销+即时重定向也可以...... (2认同)