跨多个域的单点登录[关闭]
Posted
技术标签:
【中文标题】跨多个域的单点登录[关闭]【英文标题】:Single Sign On across multiple domains [closed] 【发布时间】:2010-09-07 20:30:04 【问题描述】:我们公司设置了多个域,每个域都托管一个网站。此时,每个域都有自己的身份验证,通过 cookie 完成。
当登录到一个域的人需要访问另一个域的任何内容时,用户需要在位于另一个域的另一个网站上使用不同的凭据再次登录。
我正在考虑转向单点登录 (SSO),以便消除这种麻烦。我将不胜感激有关如何实现这一点的任何想法,因为我在这方面没有任何经验。
谢谢。
编辑: 这些网站混合了 Internet(外部)和 Intranet(公司内部使用)网站。
【问题讨论】:
这听起来像是 OpenID 的工作 - 但只允许来自您的登录域的 ID。 @Will 这个问题可能不适用于 SE 网络中的这个网站,但绝对有建设性。 @BinarWeb 关闭原因自 2008 年以来发生了变化。当时,这是最适用的选择。 【参考方案1】:我在这里实现的 SSO 解决方案的工作原理如下:
-
有一个主域 login.mydomain.com 和脚本 master_login.php 管理登录。
每个客户端域都有脚本client_login.php
所有域都有一个共享的用户会话数据库。
当客户端域要求用户登录时,它会重定向到主域 (login.mydomain.com/master_login.php)。如果用户没有登录到主服务器,它会向用户请求身份验证(即显示登录页面)。用户通过身份验证后,它会在数据库中创建一个会话。如果用户已经通过身份验证,它会在数据库中查找他们的会话 ID。
主域返回到客户端域 (client.mydomain.com/client_login.php) 传递会话 ID。
客户端域创建一个 cookie,用于存储来自主服务器的会话 ID。客户端可以通过使用会话ID查询共享数据库来找到登录的用户。
注意事项:
会话 ID 是使用 RFC 4122 算法生成的唯一全局标识符 master_login.php 只会重定向到其白名单中的域 主服务器和客户端可以位于不同的***域中。例如。 client1.abc.com、client2.xyz.com、login.mydomain.com【讨论】:
这看起来是一个很好的解决方案。你在数据库中存储什么?是(session_id、用户名、hashed_password)吗? 主域 login.mydomain.com 宕机的情况如何处理?那时无法登录吗? 任何机构产生了任何代码示例或 github repo? 这是几乎所有 SSO 协议(例如 SAML)都指定的内容,但对重放攻击等具有更高的安全性。 如果他们不共享用户数据库怎么办?每个合作伙伴网络应用程序都有自己的用户群。我们如何遇到这种情况?【参考方案2】:不要重新发明***。有许多开源跨域 SSO 包,例如 JOSSO、OpenSSO、CAS、Shibboleth 等。如果您在整个(IIS、AD)中使用 Microsoft 技术,则可以改用 microsoft federation (ADFS)。
【讨论】:
绝对 - 我见过太多人推出自己的安全解决方案,却发现他们容易受到重放、XSRF 或其他攻击 +1 你应该 [几乎] 永远不要重新发明安全轮。 OpenSSO 已死,JOSSO 和 CAS 是 JAVA 解决方案。仅供参考【参考方案3】:主机名有何不同?
这些主机可以共享 cookie:
mail.xyz.com www.xyz.com logon.xyz.com但这些不能:
abc.com xyz.com www.tre.com在前一种情况下,您可以使用基于 cookie 的解决方案。想想 GUID 和数据库会话表。
【讨论】:
【参考方案4】:如果您使用 Active Directory,您可以让每个应用程序都使用 AD 进行身份验证,这样就可以无缝登录。
否则,如果应用程序可以在后台相互通信,您可以使用 sessionids 并让一个应用程序处理 id 生成服务所有其他应用程序。
【讨论】:
用户在本次会话中第一次登陆这些站点时是否还需要在 domain1.com 和 domain2.com 和 domain3.com 上输入用户名和密码?以上是关于跨多个域的单点登录[关闭]的主要内容,如果未能解决你的问题,请参考以下文章