27

我有一个小问题。

如何为多个域设置 cookie?

我确实了解安全问题,并且我确信以前已经这样做过。原因是 SSO。

IE。

account.domain.com将需要设置登录的域:

domain.com、domain1.com、domain2.com。

有没有简单的方法,使用 PHP 和 cookie 或任何替代方法?

4

4 回答 4

33

domain.com 绝对没有办法为 domain1.com 设置 cookie。您尝试做的事情只能通过让用户的浏览器向每个域提交请求来解决,然后每个域将设置自己的 cookie。

然后,您需要为每个域提供一种方法来验证用户的身份。有两种方法:

  1. 反向通道 - 站点直接相互联系以确定用户是否已登录。
  2. 在 GET 或 POST 中传递令牌 - 当用户的浏览器被重定向到另一个站点时,会传递一个包含身份和会话状态的数字签名参数。

这真的很复杂。我建议你不要自己动手。查看SimpleSAMLPHP以了解我所描述的 PHP 实现。

于 2009-07-08T02:44:43.497 回答
6

您正在尝试的事情无法完成。(这是一个浏览器安全问题,而不是 PHP 问题。)

除了使用某种形式的异地身份验证之外,您可以实现的最接近的方法是使 cookie 可以跨子域访问,在这种情况下,您只需使用 PHP 的set_cookie函数的可选“域”参数。

于 2009-07-05T16:25:21.487 回答
6

这可以通过一个域充当主机而其他域充当从属来完成。

假设我们有一个域 accounts.domain.com,它是我们的主人。

然后我们得到了我们的奴隶domain.comsomething.com并且another.com

当您登录 domain.com 时,它实际上是 site accounts.domain.com,然后您将获得一个带有您浏览器唯一 ID 的 cookie,然后您将被重定向到 domain.com 的登录后登录页面(即。domain.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>)。登陆页面将联系accounts.domain.com,并使用浏览器 ID 进行查询。如果交易没问题,那么您将从domain.com.

接下来,在每个域(domain.comsomething.comanother.com上将初始重定向到accounts.domain.com/roaming-check?return-url=<URL the redirect was initiated from>. 因为我们要回家了(我们已经登录了accounts.domain.com),所以我们将在我们的登录页面(<domain name>.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>)上再次被重定向,从这一点开始,它与登录的部分相同。我们无缝地漫游到另一个域(用户不知道它,因为浏览器通常不会显示重定向的页面,直到它通过标头发送(服务器)/接收(浏览器)部分)。

如果实际上没有活动登录,该站点会将这个“否定登录”保存到会话中,并且不再尝试检查登录(直到我们尝试登录或加载另一个域)。

于 2011-08-09T21:37:04.687 回答
4

我认为此解决方案将满足您的需求:“ PHP 的简单单点登录

于 2009-07-05T14:22:37.423 回答