跨多个域的单点登录

时间:2020-03-05 18:47:50  来源:igfitidea点击:

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

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

我当时正在考虑迈向单一登录(SSO),以便消除这种麻烦。我不愿就如何实现这一目标提出任何想法,因为我在这方面没有任何经验。

谢谢。

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

解决方案

回答

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

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

回答

主机名有何不同?

这些主机可以共享Cookie:

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

但是这些不能:

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

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

回答

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

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

笔记:

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

回答

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