111

我们公司设置了多个域,每个域都托管一个网站。此时,每个域都有自己的身份验证,通过 cookie 完成。

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

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

谢谢。

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

4

4 回答 4

92

我在这里实现的 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,存储来自主服务器的会话 ID。客户端可以通过使用会话 ID 查询共享数据库来找出登录用户。

笔记:

  • 会话 ID 是使用 RFC 4122 中的算法生成的唯一全局标识符
  • master_login.php 只会重定向到其白名单中的域
  • 主服务器和客户端可以在不同的顶级域中。例如。client1.abc.com、client2.xyz.com、login.mydomain.com
于 2008-09-05T00:07:43.280 回答
33

不要重新发明轮子。有许多开源跨域 SSO 包,例如 JOSSO、OpenSSO、CAS、Shibboleth 等。如果您在整个(IIS、AD)中使用 Microsoft 技术,则可以改用 microsoft federation (ADFS)。

于 2008-09-15T16:52:39.813 回答
15

主机名有何不同?

这些主机可以共享 cookie:

  • 邮件.xyz.com
  • www.xyz.com
  • 登录.xyz.com

但这些不能:

  • 美国广播公司
  • xyz.com
  • www.tre.com

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

于 2008-09-04T19:38:10.307 回答
2

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

否则,如果应用程序可以在幕后相互通信,您可以使用 sessionids 并让一个应用程序处理 id 生成服务所有其他应用程序。

于 2008-09-04T19:12:19.823 回答