多域单点登录

4

我目前正尝试将两个不同域名的Web应用程序example1.com和ex.example2.net连接起来,以便您可以登录example1并单击链接到example2,即可立即登录,因为这样更方便客户只需登录一次即可在网站之间导航。

我已经研究了各种方法,如php会话、开放式ID(OpenID)、JOSSO和Kerberos,但什么是安全且易于实现的方式呢?


这些 Web 应用程序在同一台服务器上吗? - Tivie
抱歉,我应该进一步阐述。它们在不同的虚拟机上。 - Josh Naylor
然后,在我看来,OpenID 是可行的方式!(请查看我的编辑帖子) - Tivie
4个回答

2
Kerberos非常广泛,适用于需要高安全性的系统。它很难使用,即使是总体设置,我也不建议这条路,除非您非常了解Linux,并且提供您的托管提供商允许您访问机器。对于JOSSO或OpenID,我不太熟悉,无法做出良好的评论。
任何php会话仅适用于域和服务器,有点像cookie但又不同,但总的来说,您会使用它们。
我认为最简单的解决方案是,如果两个站点位于同一托管帐户/服务器上,则要具有特定于此原因的数据库。您将创建一个与平常相同的登录系统,但是您将有两个站点从此登录中读取。除了正常的登录之外,您还将拥有一个会话跟踪表。通常,用户登录时已经设置了会话以使他们保持登录状态,您将在此处执行相同的操作,但是您将添加一个cookie到方程式中,两个站点都可以识别并用于比较在此新表中输入的条目,其中跟踪您的用户。我建议在一个cookie中尝试IP、浏览器和可能的userID,还要有一种唯一的哈希,它基于某些只有服务器可以重新创建的用户信息。
当然,我在概念上简化了它,它比我描述的要复杂一些,但这将是您的一般步骤。
另外,如果站点彼此独立,您始终可以创建一个API在它们之间传递信息,以JSONP样式进行操作,以便其中一个可以充当登录的中心,而另一个则只验证。
但总的来说,这完全取决于您想要实现的内容,如何、何时、何地等。

如果域名在不同的服务器上,这个还能正常工作吗? - Josh Naylor
可以实现,但您必须决定哪一个将成为交互的中心,因为您还需要编写一个API来代表另一个服务器与数据库进行交互。另一个服务器将调用此API,而API将返回所需的任何内容。正如我在答案中所说,它比我描述的要复杂一些,但仍然是可能的。单点登录不容易实现,但如果您需要多个站点,则回报非常棒。 - chris
目前只有两个Web应用程序。但是当我们扩展并与之关联多个Web应用程序时,example1.com将成为中心枢纽。 - Josh Naylor
那么,你需要在中心构建一个类似API的服务,其中包含共享凭据和验证它们在站点/服务器之间的核心逻辑,该服务可以输出或发送数据回到发送请求的服务器。我打算尽快自己构建SSO选项,我有50多个网站要建立,我希望有一个核心登录和用户基础。所以我理解你的痛苦,但最终这是值得的。 - chris

1
如果这个方案适合你,我的建议是采用openID路线。这是更简单、足够安全的方式。此外,用户注册过程也更加简单和快捷。
如果你愿意,你实际上可以只允许来自你的登录域的ID,使其成为一个“私有”的登录系统。
当然,也有一些缺点...你无法对注册过程进行精细控制,你依赖于openID授权过程...如果你的主机配置不好(例如时区差异),可能会出现一些问题。
但总体而言,这是一个相对安全、易于实现的系统。
Kerberus非常安全,但使用起来很麻烦。除非你处理高度敏感的用户信息,比如信用卡号码,或者认为你的网站是黑客攻击的目标,否则我认为这不值得你花费时间。

客户需要经过哪种注册流程?这是物流追踪,因此将包含客户详细信息但不包括银行信息。这样安全吗? - Josh Naylor
嗯,是的。Paypal、Google、Yahoo等公司使用OpenID(编辑:作为身份提供者),所以我认为它足够安全,尽管他们可能有自己的定制实现。 - Tivie

1

您可以使用php会话让一个应用程序处理两个站点的登录。

例如:用户在example1.com登录,php会话cookie被存储。

ex.example2.net检查example1.com并验证会话cookie。如果不存在,则重定向到example1.com登录页面或example1.com上的自定义登录页面。如果存在,则将用户登录到ex.example2.net。

如果您只想要一个链接,那么您可以生成一个哈希值,并在第一个应用程序登录后将其传递给第二个应用程序。如果哈希值验证成功,则将用户登录。


0

我会使用一个在两个网站之间共享的数据库表。如果您选择 PHP 会话路线,请不要尝试仅在不同域上从一个站点传递会话数据到另一个站点,这是行不通的。很久以前我发现了这篇帖子,对我很有帮助:跨多个域的单点登录


那对我也是非常有帮助的,谢谢。尽管这个问题已经发布了4年,但很多事情在此期间发生了变化,所以我想创建一个名为example3.com的网站,并使用一个名为login_script.php的脚本来重定向其他两个网站,验证用户身份后要么创建一个新的会话,要么查找已与该用户关联的会话。 - Josh Naylor
这仍然是最简单的解决方案,易于理解和跟进。如果您只需要这两个站点,请选择一个作为您的“主”域,您不应该需要创建第三个域。 - Richard Askew
如果一个网站在防火墙后面,这个方法还能用吗? - Sablefoste
是的,它应该可以,因为每次都在查询数据库,只要允许到达数据库服务器的路由即可。 - Richard Askew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接