55

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

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

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

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

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

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

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

基于 OpenID 或 OAuth 的东西能达到同样的效果吗?

4

5 回答 5

138

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

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

现在,下一个案例。

  • 用户点击domain2.com,跟随domain1并重定向到sso.com
  • sso.com已经有用户的 cookie,所以不显示登录页面
  • sso.comdomain2.com使用加密信息重定向回
  • domain2.com登录用户。

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

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

于 2008-12-05T00:08:50.423 回答
8

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

我在扮演中间监视杰克的人。Jack 访问domain1.com会导致准备好哈希并将其发送给他,以便当他访问时,domain2.com他可以发送该哈希作为身份验证。当他访问domain1.com时,他的请求来自我,你返回页面,我获取哈希并让他继续。我domain2.com使用哈希访问,你现在让我进入domain2.com并删除了哈希。在他尝试登录domain2.com并被告知他的凭据不再有效之前,他一点也不聪明。

你如何克服它?

于 2008-12-04T22:57:43.093 回答
7

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

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

于 2010-11-30T12:25:34.997 回答
6

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

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

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

于 2008-12-04T23:53:25.197 回答
2

What about SEO? It looks like every request before succesfull login is redirected to other domain and back. I would tell that this is very ugly. What headers should you send? 301 to SSO and then back 301 to original page? So search bot is "requested" to change his index for that page twice?

于 2010-09-17T18:14:09.310 回答