CORS:AccessControlAllowOrigin标头,包含多个域值

时间:2016-10-03 19:53:24

标签: html ajax asp.net-mvc web w3c

我有一个网站“Website1”,其中包含资源列表(images / css / js文件),我有一个多个客户端网站,他们从我的网站“Website1”中使用该资源。

我需要在响应内容中添加AccesscontrolAlloworigin标头,以解决CORS问题(对于ajax调用)仅针对列入白名单的客户端请求。

我的内容也有一些缓存逻辑,每次处理请求时都无法添加标头。我可以添加所有白名单域名作为访问控制允许原始标题值或是否有任何解决方法(我不想添加*作为值,我需要严格只允许列入白名单的域名)。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以通过创建自定义操作过滤器启用CORS或白名单域:

public class EnbaleCorsFilter : ActionFilterAttribute
{
    private const string OutgoingOriginHeader = "Access-Control-Allow-Origin";
    private const string OutgoingMethodsHeader = "Access-Control-Allow-Methods";
    private const string OutgoingAgeHeader = "Access-Control-Max-Age";
    private readonly string[] _origins;
    private readonly string _methods;

    public EnbaleCorsFilter(string[] origins = null, string methods = "*")
    {
        _origins = origins ?? new string[0];
        _methods = methods;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var host = filterContext.HttpContext.Request.Url.Host;
        var response = filterContext.HttpContext.Response;

        if (_origins.Contains(host, StringComparer.CurrentCultureIgnoreCase))
        {
            response.AddHeader(OutgoingOriginHeader, host);
            response.AddHeader(OutgoingMethodsHeader, _methods);
            response.AddHeader(OutgoingAgeHeader, "3600");
        }
    }
}

并在Application_Start()方法Global.asax文件中添加EnbaleCorsFilter

GlobalFilters.Filters.Add(new EnbaleCorsFilter(new[] { "domain1", "domain2" }));
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);