跨域登录 - 如何在从一个域转移到另一个域时自动登录用户

sma*_*ury 50 security authentication dns single-sign-on

我们提供多种在线服务.如果用户从一个服务(on domain1.com)转移到另一个服务(on domain2.com),我们需要开发一个为用户提供快速/简单体验的系统.

一旦他转移到新服务后,是否有一种安全可靠的方式自动登录用户?

如果下面的解决方案完全不安全/错误,请对我大喊大叫.

我们正在考虑一个类似于许多在线服务提供的用于密码恢复的系统 - 它们通过电子邮件发送一个带有唯一哈希的链接,该链接过期,允许他们更改密码.

domain1.com会生成一个唯一的哈希值,并将其存储在连接到用户以及一个到期时间字段的哈希数据库.

用户将被转移到 domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e

domain2.com接下来将domain1.com使用散列请求获取有关用户的信息.domain1.com然后将从数据库中删除哈希.domain2.com会记录用户并设置cookie等

可以基于OpenID或OAuth获得相同的结果吗?

Wil*_*ung 126

单点登录(SSO)在概念上非常简单.

  • 用户点击domain1.com.
  • domain1.com 看到没有会话cookie.
  • domain1.com 重定向到 sso.com
  • sso.com 提供登录页面,并获取凭据
  • sso.com 为用户设置会话cookie
  • sso.com然后重定向回domain1一个特殊的网址(如domain1.com/ssologin)
  • ssologinURL包含由这基本上是"签署"的参数sso.com.它可以像使用共享密钥加密loginid的base64一样简单.
  • domain1.com 获取加密的令牌,对其进行解密,使用新的登录ID登录用户.
  • domain1 为用户设置会话cookie.

现在,下一个案例.

  • 用户点击domain2.com,紧随其后domain1并重定向到sso.com
  • sso.com 已经为用户提供了cookie,因此不会显示登录页面
  • sso.com重定向回domain2.com加密信息
  • domain2.com 登录用户.

这是其工作原理的基础.你可以使它更健壮,功能更丰富(例如,这是SSOn,但不是SSOff,用户可以"注销" domain1,但仍然登录domain2).您可以使用公钥来签名凭据,您可以请求从SSO服务器传输更多信息(如授权权限等).您可以进行更密切的集成,例如域定期检查用户是否仍拥有SSO服务器的权限.

但是使用重定向通过浏览器进行cookie握手是所有这些SSO解决方案所依据的关键基础.

  • 小心使用带有"signed"参数的ssologin url ..如果你的参数不包含nonce/timestamp,那么捕获该查询字符串的人将能够使用它来登录.把所有内容都放在SSL上会减轻这种影响. (4认同)

Ben*_*ter 8

如果有人能够在中间玩男人并抓住那个哈希,那么他们是否能够窃取跨域转移?显然,需要在需要使用它之前生成并发送给客户端.例如说:

我正在扮演杰克的中间人.Jack访问domain1.com导致哈希准备并发送给他,这样当他访问时,domain2.com他可以发送该哈希作为身份验证.当他访问时domain1.com,他的请求来自我,你返回页面,我抓住哈希并让他继续.我domain2.com使用哈希访问,你现在让我进入domain2.com并删除哈希.在他试图登录domain2.com并被告知他的证书不再有效之前,他并不聪明.

你是如何克服的?

  • 使用SSL.如果Jack验证domain1.com服务器并且有一个保密通道,你就不能玩中间人. (4认同)

小智 7

除非您在整个会话中使用SSL,否则使用SSL进行跨域登录不会有任何意义.窃取会话cookie就像在网址中使用哈希一样容易.如果会话的其余部分不安全,那么在SSL中隐藏哈希是什么意思.

顶部给出的方法几乎是标准方法.您是否选择使用安全协议完全是另一回事,但仅加密部分会话是没有意义的.


eri*_*son 6

这是一个很好的解决方案.以下两点需要考虑:

您使用术语"哈希",但不清楚您将散列的数据.相反,使用"nonce":由加密质量RNG生成的大(128位)数字.

此外,您没有指定此项,但用户与两个域之间以及域之间的通信必须是安全的.使用SSL对服务器进行身份验证并对nonce保密.