簡體   English   中英

如何使用C#和JQuery.ajax從IE11實現CORS?

[英]How do I implement CORS from IE11 using C# and JQuery.ajax?

我正在努力讓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檢查:

    [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根本不提供Refererer,因此我無法通過添加必要的標頭來批准CORS檢查。 那么,當腳本在IE11中運行時,如何檢查源主機是否為有效主機?

您可以使用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 }
    }
});

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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM