首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C#和JQuery.ajax从IE11实现CORS?

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

Stack Overflow用户
提问于 2017-07-08 16:55:02
回答 2查看 485关注 0票数 0

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

我必须使用jquery (或浏览器本身支持的任何东西)发出ajax请求,不需要额外的库。这些请求是跨域的,它们在Chrome和Firefox中都能很好地工作。

代码语言:javascript
复制
$.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:

代码语言:javascript
复制
    [AllowCrossSiteJson]
    public string Connect()
    {
        // ... logic logic...
        var serializedMessage = JsonConvert.SerializeObject(databag, settings);
        return serializedMessage;
    }

CORS自定义属性具有以下逻辑。注意我如何检索有效域的列表,然后检查Referrer URL是否为这些域之一,然后选择接受/拒绝CORS请求:

代码语言:javascript
复制
    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中运行时,如何检查源主机是否为有效主机?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-10 18:17:16

IE11不提供跨域调用的Referrer,但它提供了Origin。

我用的是这个。对“有效”源域的检查现在如下所示:

代码语言:javascript
复制
    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;
    }
票数 0
EN

Stack Overflow用户

发布于 2017-07-08 17:07:36

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

代码语言:javascript
复制
// Request with custom header
$.ajax({
    headers: { 'x-cors-auth': window.location.href }
});

在这里,您可以将这些头文件设置为您想要的任何值。由于IE不会发送referrer,您可以尝试实际设置referrer头。

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

代码语言:javascript
复制
$.ajaxSetup({
    beforeSend: function(xhr) {
        headers: { 'x-cors-auth': window.location.href }
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44984371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档