跨域login – 如何从一个域转移到另一个域时自动login用户

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

有一个安全可靠的方法,一旦他被转移到新的服务自动login用户?

如果下面的解决scheme是完全不安全的/错误的,大喊大叫我。

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

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

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

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

基于OpenID或OAuth的东西能达到相同的结果吗?

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

  • 用户点击domain1.com
  • domain1.com看到没有会话cookie。
  • domain1.comredirect到sso.com
  • sso.com提供login页面,并取得凭据
  • sso.com为用户设置会话cookie
  • sso.com然后redirect到domain1到一个特殊的url(如domain1.com/ssologin
  • ssologinurl包含一个基本上由sso.com “签名”的sso.com 。 它可以像使用共享密钥对loginid进行encryption的base64一样简单。
  • domain1.com将encryption的令牌解密,使用新的loginIDlogin用户。
  • domain1为用户设置会话cookie。

现在,下一个案例。

  • 用户点击domain2.com ,在domain1 sso.com然后redirect到sso.com
  • sso.com已经为用户提供了一个cookie,所以不会显示login页面
  • sso.com用encryption信息redirect到domain2.com
  • domain2.comlogin用户。

这是如何工作的基础。 您可以使其更强大,function更丰富(例如,这是SSOn ,但不是SSOff ,用户可以“注销” domain1 ,但仍然login到domain2 )。 您可以使用公钥对证书进行签名,您可以请求从SSO服务器传输更多信息(如授权等)。 您可以进行更加贴心的整合,例如域定期检查用户仍然拥有来自SSO服务器的权限。

但是通过浏览器使用redirect的cookie握手是所有这些SSO解决scheme所基于的关键基础。

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

我正在玩中间谍的中间人杰克。 Jack访问domain1.com ,这会导致一个散列被准备好并发送给他,这样当他访问domain2.com他可以发送该散列作为authentication。 当他访问domain1.com ,他的请求通过我,你返回页面,我抓住哈希,让他继续下去。 我使用哈希访问domain2.com ,现在让我进入domain2.com并删除哈希。 直到他试图login到domain2.com ,他才明智,并被告知他的凭证不再有效。

你如何克服?

除非您在整个会话中使用SSL,否则使用SSL进行跨域login将不会有任何意义。 窃取会话cookie就像在url中使用哈希一样简单。 如果会话的其余部分不安全,那么在SSL中隐藏散列的意义何在?

顶部给出的方法几乎是标准方法。 不pipe你select使用安全协议,完全是另外一回事,但仅对部分会话进行encryption是毫无意义的。

这是一个很好的解决scheme。 这里有两点需要考虑:

您使用术语“散列”,但不清楚您将散列什么数据。 相反,使用“nonce”:由密码质量RNG生成的一个大的(128位)数字。

另外,您没有指定,但用户与两个域之间以及域之间的通信必须是安全的。 使用SSL对服务器进行身份validation,并保留现时的机密性。

怎么样SEO? 它看起来像成功login前的每个请求被redirect到其他域和后面。 我会说这是非常丑陋的。 你应该发送什么标题? 301到SSO,然后回301到原来的页面? 所以search机器人是“请求”来改变他的索引两次?