IE11下CORS访问被拒问题求助:ASP.NET MVC跨SSL调用异常
解决IE11中HTTPS站点AJAX请求同站点HTTP接口的Access Denied问题
我之前维护ASP.NET MVC项目时也踩过IE11这个跨协议请求的大坑!结合你的场景,给你几个针对性的解决方案:
先排查IE11客户端安全设置
这是最直接的临时验证方法:打开IE11的「Internet选项」→「安全」→「自定义级别」,找到「跨域访问数据源」选项,设置为「启用」。不过这是客户端设置,没法要求所有用户修改,所以核心还是得从服务器端入手。配置IIS响应头适配IE11的XDomainRequest
IE10/11并不完全遵循标准CORS规范,它用XDomainRequest对象处理跨域(包括跨HTTPS→HTTP的同站点请求),需要额外配置响应头:- 打开IIS管理器,找到你的站点→「HTTP响应头」
- 添加以下响应头:
Access-Control-Allow-Origin:设置为你的HTTPS站点域名(比如https://your-app-domain.com,不要用*如果涉及认证)Access-Control-Allow-Methods:GET, POST, OPTIONSAccess-Control-Allow-Headers:Content-Type
处理ASP.NET中的OPTIONS预检请求
跨协议请求会触发OPTIONS预检,服务器必须正确响应才能让后续请求执行。在项目的Global.asax.cs中添加以下代码:protected void Application_BeginRequest() { if (Request.HttpMethod.Equals("OPTIONS", StringComparison.OrdinalIgnoreCase)) { Response.StatusCode = (int)HttpStatusCode.OK; Response.AppendHeader("Access-Control-Allow-Origin", Request.Headers["Origin"]); Response.AppendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); Response.AppendHeader("Access-Control-Allow-Headers", "Content-Type"); Response.End(); } }最优解:把非SSL接口升级为HTTPS
其实跨HTTPS→HTTP的请求本身就存在安全风险,浏览器(尤其是IE11)会做严格限制。如果可能的话,直接把站点的所有接口都切换到HTTPS,彻底消除跨协议的问题,这才是一劳永逸的办法。调整AJAX请求的写法适配IE11
如果你用jQuery发送AJAX请求,需要关闭withCredentials(因为XDomainRequest不支持带Cookie的请求):$.ajax({ url: "http://your-app-domain.com/api/non-ssl-endpoint", type: "POST", data: yourData, xhrFields: { withCredentials: false }, success: function(response) { // 处理响应 } });或者直接使用原生
XDomainRequest对象(仅针对IE11):if (window.XDomainRequest) { var xdr = new XDomainRequest(); xdr.open("POST", "http://your-app-domain.com/api/non-ssl-endpoint"); xdr.onload = function() { console.log(xdr.responseText); }; xdr.onerror = function() { console.error("XDR请求失败"); }; xdr.send(JSON.stringify(yourData)); }
内容的提问来源于stack exchange,提问作者Waqar Hussain
相关产品推荐
相关产品推荐

