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

时间:2008-12-04 22:53:20

标签: security login single-sign-on dns

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

有一种安全可靠的方法可以在用户转移到新服务后自动自动登录吗?

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

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

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

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

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

基于OpenID或OAuth的内容能否达到相同的效果?

5 个答案:

答案 0 :(得分:122)

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

  • 用户点击domain1.com
  • domain1.com看到没有会话cookie。
  • domain1.com重定向到sso.com
  • sso.com显示登录页面并获取凭据
  • sso.com为用户设置会话Cookie
  • sso.com然后重定向回domain1个特殊网址(如domain1.com/ssologin
  • ssologin网址包含一个基本上由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解决方案所依据的关键基础。

答案 1 :(得分:8)

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

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

你是如何克服的?

答案 2 :(得分:7)

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

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

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:2)

SEO怎么样? 看起来成功登录之前的每个请求都被重定向到其他域并返回。 我会说这很难看。 你应该发送什么标题? 301到SSO然后回301到原始页面?因此,“请求”搜索僵尸程序两次更改该页面的索引?