关于身份验证:跨多个域的单点登录

关于身份验证:跨多个域的单点登录

Single Sign On across multiple domains

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

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

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

谢谢。

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


我在这里实现的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 Technology(IIS,AD),则可以使用Microsoft联合身份验证(ADFS)。


    主机名有何不同?

    这些主机可以共享Cookie:

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

    但是这些不能:

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

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


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

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


    推荐阅读