使用JWT实现单点登录(SSO)

24

我已经阅读了几篇关于单点登录(sso)的文章,但是在我的脑海中还没有找到答案。

场景:

  • 我的公司想要使用jwt实现sso机制。
  • 公司有2个不同的域名,分别为abc.comxyz.com,简写为abcxyz
  • 还有一个主域名(masterdomain)用于管理客户端身份验证。
  • 用户X首先想要登录abc
  • abc将凭证发送到masterdomain进行身份验证,然后创建一个签名的jwt以便发送回abc
  • abc将该jwt保存在cookie中。
  • 一段时间后,如果在同一台计算机上尝试登录abc,系统将不会询问凭据并自动登录用户。

问题:

如果用户尝试在xyz域中打开页面,系统如何知道用户以前已经登录过?我的意思是xyz域无法访问包含jwt的abc cookie。应该发送哪些信息给xyz,表明用户X正在尝试登录?

谢谢!

1个回答

25
你可以将JWT认证令牌存储在连接到主页的中间域名的cookie/localStorage中,使用一个iframe进行实现。

cross domain sso

Scenario
- abc向masterdomain发送凭据,masterdomain对用户进行身份验证,然后创建一个签名的JWT以便发送回abc。 - masterdomain将此JWT保存在cookie中。 - 一段时间后,如果在同一台计算机上尝试登录到abc,则系统不会要求凭据并自动登录用户。 - 最后,当用户进入第二个域xyz时,iframe从masterdomain存储中恢复jwt,并自动登录用户。
CORS不是问题,因为masterdomain.com可以访问其存储,并且如果源和目标得到识别,则允许iframes之间的通信(请参见http://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage)。
为了简化开发,我们最近发布了一个开源项目JWT跨域SSO,链接为https://github.com/Aralink/ssojwt

如果用户进入了钓鱼网站并且失去了访问令牌,安全性如何? ssojwt 能够覆盖这种情况吗? - Vunb
4
@Vunb,iframe的"postmessage"函数要求源站和目标站必须事先得到授权,否则浏览器将不允许消息传递,因此攻击者无法访问共享令牌,因为它不在白名单中。 - pedrofb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接