PHP多站点登录

7

我目前正在处理一个跨多个域的项目。我希望用户在一个站点登录后,能够同时在其他所有站点也被自动登录。

用户会话存储在数据库中,我在每个域上设置的cookie包含会话ID。

基本上,当用户登录example.com时,会创建一个带有其会话ID的cookie,并将会话数据存储在数据库中。完成此操作后,需要在所有其他域上创建一个带有此唯一会话ID的cookie,以便用户从站点到站点移动时可以自动登录。

我已经找到了在Firefox中实现此功能的方法(使用图像标签在其他域上执行PHP脚本,从而在不同的域上创建不同的cookie),但是这种方法在IE中无法工作(尚未测试Opera或Safari等)。

有人有任何想法如何在IE中使其正常工作吗?

5个回答

3
请看我的问题跨域用户跟踪
你需要做的是向“image”添加另一个HTTP头。
引用自Internet Explorer 6中使用FRAMESET时会丢失会话变量

您可以向子内容添加P3P紧凑策略标头,并声明不会对用户数据执行任何恶意操作。如果Internet Explorer检测到满意的策略,则允许设置cookie。

一个简单的满足此条件的紧凑策略如下:

P3P:CP =“CAO PSA OUR”

此代码示例显示,您的站点提供您访问自己的联系信息(CAO),任何分析数据仅为“伪分析”,这意味着数据与您的在线人物而不是您的身份相连(PSA),并且您的数据不会提供给任何外部机构供其使用(OUR)。

如果在ASP页面中使用Response.AddHeader方法,则可以设置此标头。在ASP.NET中,可以使用Response.AppendHeader方法。您可以使用IIS管理控制台(inetmgr)添加到静态文件。

按照以下步骤将此标头添加到静态文件中:

  1. 单击“开始”,单击“运行”,然后键入inetmgr。
  2. 在左侧导航页面中,单击要向其中添加标头的Web站点中的适当文件或目录,右键单击该文件,然后单击“属性”。
  3. 单击“HTTP标头”选项卡。
  4. 在自定义HTTP标头组框中,单击“添加”。
  5. 输入P3P作为标头名称,然后为紧凑策略字符串输入CP = ...,其中“...”是您的紧凑策略的适当代码。

2
没错,我发现是IE中默认的媒体设置阻止了它。通过添加以下代码:header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');现在一切都正常工作 :D - user48526

1

不确定在您的开发阶段是否是一个好建议,但如果您想以“正确”的方式完成它,那么一定要看看单点登录


是的,那正是我正在寻找的,我已经在Firefox中实现了它,但在IE中却无法工作。也许我只是方法不对。 - user48526

1

是我想多了吗?还是使用在 Firefox 中有效的图片技术,你正在自己实施 CSRF 攻击呢?

有趣的方法,但我希望你不要让自己面临安全威胁。


我最初认为这是个问题,实际上也发现确实存在问题。但是经过一番调试等操作后,我认为我已经解决了这个问题。 - user48526

0

我自己没有做过这个,但我认为你走的方向是正确的。我可能会做同样的事情,只不过我会使用一个Javascript文件代替图像。它将在服务器端生成,并在客户端更新cookie。


-1
也许我有点傻,但是你不能在登录时为每个域名设置cookie吗?这样,他们登录到A站点时不仅有一个cookie,而是有五个或者你拥有的任意数量的站点?
setcookie(A, $sessid, expire, path, domainA.com);
setcookie(B, $sessid, expire, path, domainB.com);
setcookie(C, $sessid, expire, path, domainC.com);
setcookie(D, $sessid, expire, path, domainD.com);

是的,我先尝试了那个,但好像不起作用,因为我认为你不能为其他域设置cookie,只能为当前域设置。如果你想一下,这其实很有道理。 - user48526
您不允许为其他域设置cookie。 - Luceos

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