【问题标题】:CORS: AccessControlAllowOrigin header with mulltiple domain valuesCORS:访问控制允许具有多个域值的 Origin 标头
【发布时间】:2016-10-04 05:09:08
【问题描述】:
我有一个包含资源列表(图像/css/js 文件)的网站“Website1”,并且我有多个客户端网站,它们使用我的网站“Website1”中的资源。
我需要在响应内容中添加 AccesscontrolAlloworigin 标头,以仅对列入白名单的客户端请求解决 CORS 问题(用于 ajax 调用)。
此外,我的内容有一些缓存逻辑,我无法在每次处理请求时添加标头。我可以将所有列入白名单的域名添加为访问控制允许原始标头值,还是有任何解决方法可以做到这一点(我不想添加 * 作为值,我只需要严格允许列入白名单的域名)。任何帮助表示赞赏。
【问题讨论】:
标签:
html
ajax
asp.net-mvc
web
w3c
【解决方案1】:
您可以通过创建自定义操作过滤器来启用 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);