我们提供多种在线服务。我们需要开发一个系统,如果用户从一个服务(domain1.com
)转移到另一个服务(domain2.com
),则可以为用户提供快速/简单的体验。
有一种安全可靠的方法可以在用户转移到新服务后自动自动登录吗?
如果下面的解决方案完全不安全/错误,请对我大喊大叫。
我们正在考虑一个类似于许多在线服务提供的用于密码恢复的系统 - 它们通过电子邮件发送一个带有唯一哈希的链接,该链接过期,允许他们更改密码。
domain1.com
将生成一个唯一的哈希,并将其存储在数据库中,其中哈希链接到用户以及过期日期时间字段。
用户将转移到domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e
domain2.com
接下来会使用哈希向domain1.com
发出请求以获取有关用户的信息。然后domain1.com
将从数据库中删除哈希。 domain2.com
会记录用户并设置cookie等。
基于OpenID或OAuth的内容能否达到相同的效果?
答案 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到原始页面?因此,“请求”搜索僵尸程序两次更改该页面的索引?