跨域cookies在IE 8和9没有的iframe?(Cross-domain cookies in

2019-08-17 06:05发布

假设我控制两个域, www.api_domain.comwww.website_domain.comwww.api_domain.com提供了需要用户身份验证,然后使用会话cookie来识别谁发出请求用户的API。 www.website_domain.com从加载脚本到其页面www.api_domain.com和脚本想让到API网址调用www.api_domain.com与当前用户的cookie和网页上以某种方式使用结果www.website_domain.com

对于最初加载脚本,或者不需要用户的会话cookie来工作的任何API网址,最简单的方法就是使用一个

Access-Control-Allow-Origin: http://www.website_domain.com

头从响应www.api_domain.com 。 这似乎摸出上除了IE浏览器所有的方块,尽管IE不会尊重对使用jQuery的AJAX方法制成的AJAX请求允许来源头,有喜欢的xdr.js库里面做的场景背后的一些魔术让jQuery的,IE和允许来源头部发挥好在一起,行为像所有其他浏览器(我不知道xdr.js做什么细节,但是它完全适用于非特命请求,据我可以看到)。

问题是当我想打一个网址http://www.api_domain.com需要用户的会话cookie。 当这个问题在浏览器无关的设置进行了讨论,两种解决方案通常建议:

  1. 使用Access-Control-Allow-Credentials: true从做饼干甚至跨域请求被发送的响应。
  2. 在创建页面上的iframe http://www.website_domain.com原产http://www.api_domain.com ,有两个窗口相互沟通使用HTML5发布消息 ,并委派发出请求的所有责任http://www.api_domain.com到iframe中。

我非常喜欢,如果可以使用选项1,因为它可以让你写你的JavaScript代码使用的API http://www.api_domain.com中,你会写这倒好同域的API相同的方式。 要使用iframe的方法,我们需要学习或创建发送AJAX类似请求的iframe中,成功和错误处理一些框架。 这也意味着我们需要创建的代码加载到iframe中,这将仅仅是瘦包装的整体块击中的API网址。 这似乎只是丑陋,棘手,并且难度比第一种方法来了解。

然而,我无法弄清楚如何使IE选项1的工作。 我设置Access-Control-Allow-Credentials: true我的API网址,和所有其他的浏览器cookie发送到这些网址,但IE 9不对,即使有xdr.js库。 (我还没有对IE 8进行测试)没有其他症状时,任何报告。 我可以看到正确的Access-Control-Allow-OriginAccess-Control-Allow-Credentials从响应头www.api_domain.com当我在IE浏览器的开发者工具查看它们,但也有在请求中没有cookie头。

有一些黑客攻击或魔法咒语,我可以用它来使Internet Explorer尊重Access-Control-Allow-Credentials头,或其他一些头部,我可以使用IE浏览器识别?

Answer 1:

选项1是不可能在IE9或更低,因为对于使用XMLHttpRequest CORS的支持。 此外,如果您尝试使用XDomainRequest,你将永远无法与你的请求一起发送的任何cookie。 我一直沿着这条道路与testswarm多次使用上写的UI测试库工作。 你想要做的是不以这种方式成为可能。

这里是一个后由Eric法,一名前微软开发者,在详细讨论这个问题: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and- workarounds.aspx

的相关部分,其清楚地表明用CORS请求发送的cookie是在IE 8和9是不可能的,如下:

在Internet Explorer 8中,引入了XDomainRequest对象。 这个对象允许AJAX应用程序直接通过确保HTTP响应使安全跨域请求只能由当前页面读取如果数据源表示响应是公开的; 以这种方式,同源策略的安全保障受到保护。 反应表明他们愿意允许包括访问控制允许来源的HTTP响应标头值*,或调用页面的确切来源跨域访问。

在设计新的对象,以确保现有的网站和服务不会在危险之中是我们的首要任务。 为此,我们实行了一些关于什么样的请求的限制,可以与XDomainRequest对象进行。

...

5:无认证或Cookie将请求发送

为了防止用户的周围滥用权力(如饼干,HTTP的凭证,客户端证书等),请求将被剥离饼干和凭证的,将忽略HTTP响应任何身份验证挑战或Set-Cookie的指令。 XDomainRequests不会在先前验证的连接发送,因为一些Windows身份验证协议(如NTLM / Kerberos的)是每个连接为基础的,而不是每个请求为基础的。

那些希望对跨域请求执行用户的身份验证的网站可以使用显式方法(例如令牌在POST身体或URL)通过这个认证信息,而不会危及用户的周围权威。

现在,假设你控制两个位置,你大概可以创建一个服务器到服务器的认证过程,并着手通过从域提供各种各样的会话ID,对于其他领域,其中客户端实际上是通过你的要求。 这不是很漂亮,但它的工作原理。 这种方法也被在文章中提到。 你会要小心,但因为它开辟了会话劫持的可能性。



Answer 2:

IE8 +具有一个替代XMLHttpRequest这就是支持凭证是XDomainRequest 。 反正XDomainRequest不JQuery的实现,因为它具有比由提供功能较少XMLHttpRequest ,但有类似插件的jQuery插件CORS提供你所需要的。

jQuery插件透明地增加了跨源资源共享(CORS)之间的浏览器包括IE8 +,允许使用cookie和头支持跨域Ajax请求。

同时我认为,但不知道,IE浏览器不支持通配符像头Access-Control-Allow-Origin: *



文章来源: Cross-domain cookies in IE 8 and 9 without an iframe?