跨多个域的单点登录

113

我们公司有多个域名,每个域名都托管了一个网站,并且每个域名目前都有自己的身份验证方式,通过 cookie 实现。

当一个已登录的用户需要从另一个域名访问任何内容时,用户需要在另一个域名上使用不同的凭据再次登录。

我考虑转向单点登录(SSO),以消除这种麻烦。 我将感激任何关于如何实现这一目标的想法,因为我在这方面没有任何经验。

谢谢。

编辑: 这些网站是互联网(外部)和内联网(公司内部使用)网站的混合体。


这听起来像是 OpenID 的工作 - 但只允许来自您的登录域的 ID。 - Neall
3
这个问题可能不适合在SE网络中,但绝对是有建设性的 - Binar Web
@BinarWeb 关闭原因自2008年以来已经发生了变化。当时,这是最适用的选择。 - user1228
4个回答

95
我实现的SSO解决方案工作原理如下:
  1. 有一个主域名login.mydomain.example,其中包含管理登录的脚本master_login.php
  2. 每个客户端域都有脚本client_login.php
  3. 所有域都共享一个用户会话数据库。
  4. 当客户端域需要用户登录时,会重定向到主域(login.mydomain.example/master_login.php)。如果用户没有登录到主域,则从用户请求身份验证(即显示登录页面)。用户认证成功后该解决方案会在数据库中创建一个会话。如果用户已经通过身份验证,则在数据库中查找其会话ID。
  5. 主域返回到客户端域(client.mydomain.example/client_login.php)并传递会话ID。
  6. 客户端域创建存储来自主域的会话ID的Cookie。客户端可以使用会话ID查询共享数据库以获取已登录用户的信息。

注意:

  • 会话ID是使用RFC 4122算法生成的唯一全局标识符。
  • master_login.php只会将重定向发送到其白名单中的域。
  • 主和客户端可能位于不同的顶级域中。例如:client1.abc.exampleclient2.xyz.examplelogin.mydomain.example

3
如果主域名 login.mydomain.com 崩溃了,你会如何处理?此时登录是否不可能? - jjxtra
3
有人贡献了代码示例或者Github代码库吗? - Joshua F. Rountree
1
这几乎是所有SSO协议(例如SAML)所规定的,但具有更多的安全性,以防止重放攻击等。 - cweiske
2
如果他们不共享用户数据库怎么办?每个合作伙伴网站应用都有自己的用户群体。我们该如何应对这种情况? - stuckedoverflow
它们在同一个域上。如果是不同的域,我该怎么做? - csharpforevermore
显示剩余2条评论

35

不要重复造轮子。有许多开源的跨域单点登录包,例如 JOSSO、OpenSSO、CAS、Shibboleth 等等。如果你在全程使用 Microsoft 技术(IIS、AD),那么可以使用 Microsoft 联合身份验证服务(ADFS)。


4
当然 - 我见过太多人自己开发安全解决方案,结果发现他们容易受到重放攻击、XSRF或其他攻击的威胁。 - user404345
8
你几乎不应该重新发明安全轮子。 - Mark E. Haase
14
OpenSSO已经停止维护,JOSSO和CAS是JAVA解决方案。仅供参考。 - OneHoopyFrood

17

这些主机名有多不同?

这些主机可以共享cookie:

  • mail.xyz.example
  • www.xyz.example
  • logon.xyz.example

但是这些不能:

  • abc.example
  • xyz.example
  • www.tre.example

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


2
如果您使用Active Directory,每个应用程序都可以使用AD进行身份验证,登录过程将无缝完成。
否则,如果应用程序能在后台互相通信,您可以使用sessionids,并且有一个应用程序处理所有其他应用程序的ID生成。

2
用户第一次进入这些网站时,他仍然需要在domain1.com、domain2.com和domain3.com上输入用户名和密码吗? - HaBo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接