使用 JQuery 在 Internet Explorer 中进行 CORS 身份验证

Posted

技术标签:

【中文标题】使用 JQuery 在 Internet Explorer 中进行 CORS 身份验证【英文标题】:CORS authentication in Internet Explorer using JQuery 【发布时间】:2014-01-04 01:45:34 【问题描述】:

我有很多可以问的问题,但我现在先从这个开始,因为它最让我烦恼。

我有一个需要身份验证的开发环境(Intranet 区域)和一个 Web 服务(Internet 区域),因此我使用的是 CORS。经过大量研究,服务器已设置为正确响应 CORS 请求;这一点我100%确定。

Web 服务已设置为允许基本身份验证和基于 cookie 的身份验证。对于我的开发环境,我决定选择基本的,因为它既好又简单,并且在 Firefox 和 Chrome 中完美运行。也就是说,当使用以下 JQuery Ajax 调用 Web 服务时,浏览器会显示一个弹出窗口并允许我登录。

$.ajax(type:'GET',
    url:'https://whatever.com/theservice',
    xhrFields: 'withCredentials': true,
    dataType: "json",
    success: function(response) 
         //do something
    
);

来自服务器的响应(缩写和信息):

HTTP/1.1 401 Unauthorized
Access-Control-Allow-Origin: http://mysandbox/
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Credentials: true
WWW-Authenticate: Basic realm="Realm"

但是,IE10 不允许这样做(不显示凭据弹出窗口),但至少有一个安全选项可以启用此行为:将“跨域访问数据源”选项设置为“启用”,嘿,它像梦一样工作,我开始弹出窗口。这是可以接受的,因为它只是一个开发环境,并不打算以这种格式发布。

但是,当我在 IE8/9(不幸的是,这是必要的)中使用相同的安全选项集测试这个相同的示例时,浏览器会收到 401 响应但不显示弹出窗口。有关信息,我正在使用 jQuery.XDomainRequest.js 库为 IE8/9 添加 CORS 功能。

所以我的问题是:是我遗漏了什么还是 IE8/9 根本不支持在 Ajax 调用期间弹出基本凭据?

【问题讨论】:

IE8/9 的 XDomainRequest 是 extremely limited。 但是,如果我在托管 Web 服务的服务器上的浏览器会话中进行预身份验证,Authorization 标头实际上将在 Ajax 调用期间由浏览器发送。编辑:对不起,它不会,我的错。 【参考方案1】:

我认为这是因为 IE8/IE9 中使用的 XDomainRequest 对象有几个严重的限制,包括您无法在请求中添加自定义标头。

以下是您应该注意的限制的综合列表:

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

当涉及到跨域请求时,我知道(您可以查看)的主要解决方法是:

JSONP 使用 Flash 或 Silverlight 在您自己的域中为远程服务托管 API

【讨论】:

那么实际上如果web服务需要认证的话,IE8/9是不可能使用CORS的? 根据我的经验,我无法给出明确的答案。但是,我的感觉是你不能使用 CORS 来做到这一点。【参考方案2】:

愚蠢的我,我刚刚意识到当“跨域访问数据源”安全选项设置为“启用”时,我不需要在 IE8/9 中使用 CORS XDomainRequest。我没有早点意识到这一点的原因是,我的网页在 HTTP 上,而服务在 HTTPS 上。将我的页面切换到 HTTPS 并删除 jQuery.XDomainRequest.js 插件后,一切都开始像魅力一样工作,在 Ajax 调用期间访问服务时,我得到了基本身份验证弹出窗口。虽然 IE7 没有工作,但这没什么大不了的。

【讨论】:

以上是关于使用 JQuery 在 Internet Explorer 中进行 CORS 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery.css 在 Internet Explorer 中获取价值

jQuery .attr() 使 Internet Explorer 崩溃

使用 jQuery 时 Internet Explorer 7 中的褪色问题

如何在 Internet Explorer 7 中使用 jQuery 获取 textarea 中的选定文本?

jQuery - 在使用 append() 附加子节点时 - 附加的 xml 标记在 Internet Explorer 11 中转换为小写

在 Internet Explorer 中的动态内容上自动增长 jQuery 插件