如何使用C#和JQuery.ajax从IE11实现CORS?

时间:2017-07-08 08:55:02

标签: javascript c# jquery asp.net ajax

我正努力通过IE11让CORS工作。

我必须使用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检查:

    [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根本不提供Referrer,因此我无法通过添加必要的标头来批准CORS检查。那么当脚本在IE11中运行时,如何检查源主机是否是有效主机?

2 个答案:

答案 0 :(得分:0)

您可以使用jQuery添加自定义标头:

// Request with custom header
$.ajax({
    headers: { 'x-cors-auth': window.location.href }
});

从这里,您可以将这些标头设置为您想要的任何值。由于IE不发送推荐人,您可以尝试实际设置推荐人头。

您还可以使用$.ajaxSetup指定将在每次请求时发送的标头,或者您将在发送之前调用您使用的多个域:

$.ajaxSetup({
    beforeSend: function(xhr) {
        headers: { 'x-cors-auth': window.location.href }
    }
});

答案 1 :(得分:0)

IE11不为跨域调用提供Referrer,但它确实提供了Origin头。

我用了这个。检查"有效"源域现在看起来如下:

render('http://localhost:8888/createForm.htmlusername='+username+'&pets='+pets+'&address='+address)
    .pipe(fs.createWriteStream('customer.pdf'));