我正在努力让CORS通过IE11工作。
我必须使用jquery (或浏览器本身支持的任何东西)发出ajax请求,不需要额外的库。这些请求是跨域的,它们在Chrome和Firefox中都能很好地工作。
$.ajax(otherDomainConnectUrl, {
contentType: 'application/json',
dataType: 'json',
crossDomain: true,
success: (connectParams, textStatus, jqxhr) => {
console.log('Connect ok. Params: ', connectParams);
success(connectParams);
},
error: (jqxr, textStatus, errorThrown) => {
this.errorRenderer.renderError(connectionError);
console.log('jquery error results:', jqxr, textStatus, errorThrown);
}
});在服务器端,我使用ASP.NET、MVC和C#。我在控制器操作上使用自定义属性执行CORS-check:
[AllowCrossSiteJson]
public string Connect()
{
// ... logic logic...
var serializedMessage = JsonConvert.SerializeObject(databag, settings);
return serializedMessage;
}CORS自定义属性具有以下逻辑。注意我如何检索有效域的列表,然后检查Referrer URL是否为这些域之一,然后选择接受/拒绝CORS请求:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var allowedDomains = ClientSpecificConfig.GetAllowedHostDomains();
if (filterContext?.RequestContext?.HttpContext?.Request?.UrlReferrer != null
&& allowedDomains.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host))
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
base.OnActionExecuting(filterContext);
}因此,对于已知域,我只附加Access-Control-Allow-Origin:*。我不想在任何地方对任何主机的调用开放该操作。
问题是IE11根本不提供引用,所以我不能通过添加必要的头来批准CORS检查。那么,当脚本在IE11中运行时,如何检查源主机是否为有效主机?
发布于 2017-07-10 18:17:16
IE11不提供跨域调用的Referrer,但它提供了Origin。
我用的是这个。对“有效”源域的检查现在如下所示:
private static bool sourceDomainIsAllowed(ActionExecutingContext filterContext, List<string> allowedDomains)
{
var request = filterContext?.RequestContext?.HttpContext?.Request;
var referrerHost = request?.UrlReferrer?.Host;
var originKey = request?.Headers.AllKeys.FirstOrDefault(k => k.EqualsIgnoreCase("Origin"));
if (!string.IsNullOrWhiteSpace(referrerHost))
{
return allowedDomains.Contains(referrerHost);
}
else if (!string.IsNullOrWhiteSpace(originKey))
{
var origin = request.Headers[originKey];
var uri = new Uri(origin);
return allowedDomains.Contains(uri.Host);
}
return false;
}发布于 2017-07-08 17:07:36
您可以使用jQuery添加自定义头部:
// Request with custom header
$.ajax({
headers: { 'x-cors-auth': window.location.href }
});在这里,您可以将这些头文件设置为您想要的任何值。由于IE不会发送referrer,您可以尝试实际设置referrer头。
您还可以使用$.ajaxSetup指定将在每次请求时发送的标头,或者您将在发送之前调用您使用的多个域:
$.ajaxSetup({
beforeSend: function(xhr) {
headers: { 'x-cors-auth': window.location.href }
}
});https://stackoverflow.com/questions/44984371
复制相似问题