ASP.Net MVC5中CORS配置失效:无法阻止未授权域跨域访问
搞定ASP.NET Web API CORS跨域限制失效的问题
看你说用了WebApi.Cors组件和自定义ActionFilter还是拦不住未授权域,大概率是配置逻辑冲突或者自定义过滤器没写到点子上,给你拆解几个关键问题和修复方案:
一、先把WebApi.Cors的基础配置做对
很多时候失效是因为配置没走全,先确认这几步:
- 先通过NuGet装对包:
Microsoft.AspNet.WebApi.Cors,注意和你的Web API版本匹配,别装错了 - 在
WebApiConfig.cs里注册全局CORS(如果打算用官方组件的话),示例代码:
public static void Register(HttpConfiguration config) { // 指定允许的域名、请求头、请求方法,别直接写*(带凭证的话*不生效) var corsSettings = new EnableCorsAttribute("https://your-allowed-domain.com", "Content-Type,Authorization", "GET,POST,PUT,DELETE"); corsSettings.SupportsCredentials = true; config.EnableCors(corsSettings); // 其他路由配置照常写 }
⚠️ 重点:别同时混用全局CORS和自定义过滤器,两者会冲突,全局配置优先级更高,选一种方式就行。
二、修复你的自定义ActionFilter漏洞
你贴的代码没写完,但从现有部分看,你的过滤器只加了Access-Control-Allow-Credentials,根本没做域名校验!这等于没限制啊!任何域名请求过来都能拿到允许的头,肯定拦不住。
给你写一个完整的正确实现:
public class AllowCrossSiteAttribute : ActionFilterAttribute { // 把你信任的域名都放这里,比如前端域名 private readonly List<string> _trustedOrigins = new List<string> { "https://your-frontend-site.com", "https://another-trusted-domain.com" }; public override void OnActionExecuting(ActionExecutingContext filterContext) { var httpContext = filterContext.RequestContext.HttpContext; var request = httpContext.Request; var response = httpContext.Response; // 获取请求里的Origin头,这是浏览器自动带的跨域标识 var requestOrigin = request.Headers["Origin"]; if (!string.IsNullOrEmpty(requestOrigin) && _trustedOrigins.Contains(requestOrigin)) { // 只给信任的域名返回CORS允许头 response.AddHeader("Access-Control-Allow-Origin", requestOrigin); response.AddHeader("Access-Control-Allow-Credentials", "true"); response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); } else { // 非信任域名直接返回403,或者不返回CORS头(浏览器会自动拦截请求) response.StatusCode = 403; filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden); return; } // 必须处理OPTIONS预检请求!浏览器跨域发非简单请求前会先OPTIONS探路 if (request.HttpMethod == "OPTIONS") { response.StatusCode = 200; filterContext.Result = new EmptyResult(); return; } base.OnActionExecuting(filterContext); } }
这里几个核心点:
- 一定要校验
Origin头,只给信任的域名返回Access-Control-Allow-Origin,绝对不能直接写*(要带Cookie/凭证的话,*和Access-Control-Allow-Credentials: true是冲突的) - 必须处理OPTIONS请求,否则浏览器会直接拦截后续的实际请求
- 用这个过滤器的话,就把全局的CORS配置关掉,避免冲突
三、排查其他容易踩的坑
- 如果部署在IIS上,检查IIS是否开启了自带的CORS模块,要是开了会覆盖你的代码配置,要么关掉IIS的CORS,要么统一用IIS的配置
- 看看有没有其他过滤器或中间件修改响应头,比如有些日志组件会重置响应头,把你加的CORS头冲掉了
- 测试的时候清一下浏览器缓存,有时候浏览器会缓存之前的CORS响应,导致测试结果不准
内容的提问来源于stack exchange,提问作者aadi1295
相关产品推荐
相关产品推荐

