Internet Explorer 10忽略了XMLHttpRequest 'xhr.withCredentials = true'。

21

我目前遇到了一个问题,使用IE10进行跨域ajax调用(在IE10模式下,而不是兼容模式)。

情况: 我有两个域名,http://ahttp://b。我为http://b设置了一个cookie。我目前在页面http://a上。

我想使用XMLHttpRequest进行CORS请求到http://b(根据http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx的说法,应该可以正常工作),并在请求中包含cookie。 JS代码如下:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://b', true);
xhr.withCredentials = true;
xhr.send();

这应该确保将cookie附加到请求中;然而,Fiddler跟踪显示没有cookie被附加,并且我收到了401:访问被拒绝的错误。

服务器已配置为与CORS一起使用,它包括Access-Control标头:

Access-Control-Allow-Origin: http://a
Access-Control-Allow-Credentials: true

(这不应该有任何影响,因为没有OPTIONS预检请求,IE发送的第一个请求是GET,cookie不存在,因此导致401错误)。

此外,这个JS片段在Firefox和Opera中都可以正常工作。


注意:当使用jQuery时,我发现使用xhrFields: {withCredentials: true}时出现了相同的行为。 - Rendijs S
2
我没有IE10,但我有一个CORS测试站点。你能否在IE10中尝试以下请求并查看是否有效?只需单击“发送请求”按钮,然后查看响应即可。我刚刚尝试了Chrome,它可以工作。如果在IE中无法正常工作,则可能是一个错误:http://client.cors-api.appspot.com/client?server.enable=true&server.credentials=true&server.httpstatus=200&client.method=GET&client.credentials=true - monsur
3
@monsur - 我进行了更多的测试。在你提供的页面中,IE10可以工作。看起来IE10支持xhr.withCredentials,但仅限于匹配二级域名的页面(例如,http://a.b.comhttp://c.b.com通信),而当二级域名不匹配时则不支持(例如,http://a.comhttp://b.com通信)。 - Rendijs S
这可能是一个错误。你的 cookie 域是什么?请注意,由 b.com 设置的 cookie 只能被 b.com 访问。它对于 a.com 上的 JS 代码是不可见的。 - monsur
是的,cookie设置在域名为http://b.com的网站上。当withCredentials设置为true时,Firefox和Opera都会包含该cookie,我还没有尝试过在Chrome和Safari中使用它。 - Rendijs S
3个回答

25

可能是IE的P3P问题。使用IE的默认设置时,如果在响应中没有同时出现P3P头部,则标记为"仅限第一方"。这意味着在第三方上下文中(如iframe或CORS请求)中,IE将拒绝发送cookie。

要解决此问题,需要在设置cookie时提供P3P标头。有关详细信息,请参见http://msdn.microsoft.com/en-us/library/ms537343%28v=vs.85%29.aspx

更新:链接已失效,但您可以在Internet Archive中查看它。


4
如果回答能够更新为确切的标题,以节省阅读文档的时间,那就太好了 :) - Poul K. Sørensen
正确的标头取决于您网站的隐私政策。或者您可以像谷歌一样做(他们的标题目前是“p3p:CP =”这不是P3P政策!请参见http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657获取更多信息。“) - Anomie
1
由于链接中的 Microsoft 文章已被删除,您能否更新答案并告诉我如何在设置 cookie 时“提供 P3P 标头”?@Anomie - Shailen Sukul
1
通过添加一个值为'CP="something"'的P3P响应头,我在Win7上使用IE11也解决了这个问题。 - Wolfram Hofmeister
这篇微软文章涵盖了该主题,并经常在类似情况下被引用:https://blogs.msdn.microsoft.com/ieinternals/2013/09/17/a-quick-look-at-p3p/ - saeraphin
请注意,以下是翻译的内容:相关内容:https://blogs.msdn.microsoft.com/ie/2012/02/20/google-bypassing-user-privacy-settings/谷歌绕过用户隐私设置 - Knu

-2

我曾遇到类似问题,结果发现浏览器设置阻止第三方 Cookie(IE10 > Internet 选项 > 隐私 > 高级 > 第三方 Cookie > 接受)。为了解决此问题,我勾选了“覆盖自动处理 Cookie”、“接受”(第三方 Cookie)和“始终允许会话 Cookie”。


我已经允许第三方Cookie,但这并没有阻止重复登录的问题。 - Shailen Sukul

-2

我们添加了一个头部 Vary: cookie,然后它就起作用了。


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