跨多个域的单点登录[关闭]


110

我们公司拥有多个域,每个域上都托管有一个网站。目前,每个域都有自己的身份验证,该身份验证通过Cookie进行。

当登录到一个域的某人需要访问另一个域的任何内容时,用户需要使用位于另一域的另一个网站上的不同凭据再次登录。

我当时正在考虑朝单一登录(SSO)迈进,以便消除这种麻烦。我不知道如何实现此目标的任何想法,因为我在这方面没有任何经验。

谢谢。

编辑: 网站是Internet(外部)和Intranet(公司内部使用)站点的组合。


这听起来像是OpenID的工作-但仅允许来自您的登录域的ID。
Neall

2
@Will这个问题可能不适用于SE网络中的此网站,但绝对具有建设性
Binar Web

自2008年以来,@ BinarWeb关闭的原因有所发展。那时,这是最适用的选择。

Answers:


91

我在这里实现的SSO解决方案的工作方式如下:

  1. 有一个主域login.mydomain.com,其脚本master_login.php用于管理登录。
  2. 每个客户端域都有脚本client_login.php
  3. 所有域都有一个共享的用户会话数据库。
  4. 当客户端域要求用户登录时,它将重定向到主域(login.mydomain.com/master_login.php)。如果用户尚未登录到主服务器,它将请求用户进行身份验证(即,显示登录页面)。用户通过身份验证后,它将在数据库中创建一个会话。如果用户已经通过身份验证,它将在数据库中查找其会话ID。
  5. 主域通过会话ID返回到客户端域(client.mydomain.com/client_login.php)。
  6. 客户端域创建一个cookie,该cookie存储来自主服务器的会话ID。客户端可以通过使用会话ID查询共享数据库来找到登录的用户。

笔记:

  • 会话ID是使用RFC 4122的算法生成的唯一全局标识符
  • master_login.php将仅重定向到其白名单中的域
  • 主服务器和客户端可以位于不同的顶级域中。例如。client1.abc.com,client2.xyz.com,login.mydomain.com

这看起来是一个很好的解决方案。您在数据库中存储了什么?是(session_id,用户名,hashed_pa​​ssword)吗?
乔恩·M

3
如果主域login.mydomain.com出现故障,您该如何处理?那时无法登录吗?
jjxtra 2011年

3
任何机构都会产生任何代码示例或github回购吗?
约书亚·鲁恩特里

这几乎是所有SSO协议(例如SAML)所指定的,但是具有针对重放攻击等的更高的安全性。
cweiske 2012年

2
如果他们不共享用户数据库怎么办?每个合作伙伴网络应用都有自己的用户群。我们怎么遇到这个?
stickedoverflow 2014年

33

不要重新发明轮子。有许多开源的跨域SSO软件包,例如JOSSO,OpenSSO,CAS,Shibboleth等。如果整个都在使用Microsoft Technology(IIS,AD),则可以使用Microsoft联合身份验证(ADFS)。


4
绝对-我已经看到太多人推出他们自己的安全解决方案,只是发现他们容易受到重放,XSRF或其他攻击的

5
+1您几乎应该(永远)不要重新发明安全轮。
Mark E. Haase 2012年

13
OpenSSO已死,而JOSSO和CAS是JAVA解决方案。只是一个供参考
OneHoopyFrood

15

主机名有何不同?

这些主机可以共享Cookie:

  • mail.xyz.com
  • www.xyz.com
  • logon.xyz.com

但是这些不能:

  • abc.com
  • xyz.com
  • www.tre.com

在前一种情况下,您可以使用基于cookie的解决方案。考虑一下GUID和一个数据库会话表。


2

如果使用Active Directory,则可以使每个应用程序都使用AD进行身份验证,然后登录就可以无缝进行了。

否则,如果应用程序可以在后台相互交谈,则可以使用sessionid,并让一个应用程序处理id生成,从而为所有其他应用程序提供服务。


2
用户第一次登陆这些站点时,是否还不必在domain1.com和domain2.com和domain3.com上输入用户名和密码?
HaBo 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.