IE 11在iframe中丢失第一方会话cookie

69
我们有一个网站(www.example.com),会将用户引导到一系列第三方页面以验证付款详情。我们在iframe中进行验证。最初,从www.example.com加载一个本地页面到iframe中,并重定向用户到第三方URL。完成用户的第三方步骤后,他们将302重定向回我们网站上的页面(www.example.com)中的iframe中。
这在我们测试过的所有浏览器中都有效,除了IE 11,在其中我们似乎丢失了cookie。我们已经在Windows 7和8.1上检查过,在桌面和“Metro”模式下都是如此,并且问题涵盖所有版本。 当用户浏览我们的网站时,我们设置了一个session cookie,它被正确地发送到最初加载在iframe中的第一方页面。然而,一旦用户通过此iframe进入了一些第三方页面,会话cookie就不会随着下一个请求被发送。
如果将IE 11的隐私设置设置为最低值,则此问题消失并且事情可以按预期进行。
到目前为止,我找到的所有潜在解决方案都与P3P标头有关。我们已经设置了有效和正确的P3P标头和XML策略文件,而此问题仅在IE 11中出现。
更新:我们使用JS设置了几个其他cookie。所有这些cookie都能按预期持久化。区别在于到期日期(JS cookie为1年,会话cookie为1个月)、域(JS cookie明确为“example.com”,会话cookie为空)以及它们是否为“HTTP only”(JS cookie为false,会话cookie为true)。
我已尝试将会话cookie的所有选项设置为与JS cookie相同,但没有任何作用。
更新2:经过更多测试,我无法创建一个能够重新创建此问题的测试案例。但是,在实际代码中尝试进行其他cookie测试时,即使它们与有效的JS cookie使用完全相同的代码进行设置,它们也似乎无法正常工作。简而言之,我还没有找到工作和不工作cookie的任何模式。

需要注意的一点是Cookie并未被删除,只是没有发送到最终请求。如果加载了另一个页面,则Cookie会神奇地重新出现并发送;这让我认为这可能与iframes和P3P相关的错误。


更新3(第3天):IE 11对Cookies的处理仍然令我困惑。我越进入微软的迷宫,就越迷失在不断变换的墙壁之间。这里有幽灵。半梦半醒的安全策略碎片组成了某种虚幻的生物,跟踪并嘲弄着我的每一个动作。起初,我惊呆了,害怕极了,看到那难以理解的形态飞快地逃离视线,但随着时间的推移,我从知道它就在我身边中获得了更多的安慰。这难道就是我来这里要面对的野兽吗?我如何能在这样的时刻杀死我唯一的伴侣呢?


你能展示一下你正在使用的P3P头吗? - vtortola
P3P: CP="ALL DSP COR CUR ADM PSA CONi OUR SAM OTR UNR LEG" 没有这个头部,iframe中的cookie都无法工作,这是预料之中的。有了它,一些cookie可以工作,但是一些cookie似乎是随机的不工作。我还没有找到不工作的cookie的模式或任何不同之处。 - Jaik Dean
请尝试访问https://dev59.com/_2zXa4cB1Zd3GeqPSVbt#13975828。 - vtortola
14
不错的诗歌,莎士比亚! - Daan
1
看这里:https://dev59.com/dHRC5IYBdhLWcg3wKtz2#16475093 - 我花了几个小时试图让P3P和cookie在iframe中正常工作。放一个无效的P3P头像“我们没有P3P”,它就可以正常工作了。 - dtbaker
显示剩余3条评论
4个回答

9

我们在使用Internet Explorer 11时遇到了类似的问题,即在https重定向后会丢失会话cookie。

请求链的情况大致如下:

对 / 的初始请求->设置会话cookie->重定向到外部URL->重定向回来(会话cookie丢失)

我们的问题是由于根据RFC952的规定,我们的测试服务器URL中有下划线导致主机名无效。如果URL不符合RFC952,则Internet Explorer在https重定向时会悄悄地丢弃会话cookie。当使用破折号代替下划线时,一切都按预期工作。

原始解决方案可在2004年的asp.net博客文章的“更新2”部分中找到。相关的Microsoft错误票据在这里

希望这能帮助某些人。


有趣的是,我在2008年发现了这个问题——域名中不允许使用下划线,因此会出现这种情况。 - Jason FB
1
我也遇到了这个问题,后来发现是主机名中的下划线导致的。编辑hosts文件解决了这个问题(因为不是生产环境,所以并不是什么大问题)。谢谢! - Amessihel

1
我注意到当IE7兼容模式被启用时,会经常丢失会话cookie,这种情况可能也适用于iframe。是否iframe发送了与父页面不同或与会话早期不同的X-UA-Compatible头值?例如,您的会话始于IE=edge,而iframe页面将其设置为IE=7。如果是这样,IE似乎会为兼容模式页面启动一个新的IE PID,并且会话cookie通常会丢失(但似乎不会被传输)。

-1

我遇到了与此主题提到的相同问题。

我们的网站被放置在一个iframe中,并使用session来存储cookie(asp.net_session)。在网站内导航时没有问题(cookie正常工作并附加到请求头中)。但是当我们将客户重定向到另一个网站(othersite.com),然后othersite.com将客户重定向回我们的域并强制其作为“_top”打开时,浏览器不会发送带有请求的cookie,因此我们失去了客户的会话。这个问题只出现在IE上。

您能给出什么建议来解决这个问题呢?


不幸的是,我从未找到解决这个问题的方法,而我知道继承它的开发人员一年左右后也遇到了这个问题。检查您的P3P标头,祝你好运! - Jaik Dean

-5

请检查IE11中的Internet选项。 工具 > Internet选项 > 隐私 > 高级

也许您应该覆盖并启用“始终允许会话cookie”。


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