2008-09-04 99 views
95

我们公司有多个域名,每个域名托管一个网站。目前,每个域都有自己的认证,这是通过cookie完成的。单一登录跨多个域

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

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

谢谢。

编辑: 该网站是互联网(外部)和内网(内部使用的公司内)网站的组合。

+0

这听起来像是[OpenID](http://openid.net/)的工作 - 但仅允许来自登录域的ID。 – Neall 2008-09-04 19:11:02

回答

2

如果您使用Active Directory,您可以让每个应用程序使用AD进行身份验证,那么登录可以是无缝的。否则,如果应用程序可以在幕后与对方进行对话,则可以使用sessionids并使用一个应用程序处理ID生成来为所有其他应用程序提供服务。

+0

是不是用户仍然需要在domain1.com和domain2.com以及domain3.com上输入用户名和密码,当他第一次登陆这些网站进行本次会话时? – HaBo 2015-04-15 21:39:23

14

主机名称有何不同?

这些主机可以共享饼干:

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

但这些不能:

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

在可以爆炸了一个基于cookie的解决方案在前一种情况下。认为GUID和数据库会话表。

76

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

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

注:

  • 会话ID是由RFC与算法生成一个唯一的全局标识符4122
  • 的master_login.php只会重定向到域在其白名单
  • 主机和客户端可以在不同的顶级域名。例如。 client1.abc.com,client2.xyz.com,login.mydomain.com
+0

这看起来像一个很好的解决方案。你在数据库中存储什么?是(session_id,用户名,hashed_pa​​ssword)? – 2010-03-23 11:41:05

+1

你如何处理主域名login.mydomain.com出现故障的情况?登录不可能在那一点上? – jjxtra 2011-03-08 00:46:58

30

不要重新发明车轮。有许多开源的跨域SSO软件包,如JOSSO,OpenSSO,CAS,Shibboleth等。如果您始终使用Microsoft技术(IIS,AD),则可以使用Microsoft联合身份验证(ADFS)。