You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

这里几个核心点:

  1. 一定要校验Origin头,只给信任的域名返回Access-Control-Allow-Origin,绝对不能直接写*(要带Cookie/凭证的话,*和Access-Control-Allow-Credentials: true是冲突的)
  2. 必须处理OPTIONS请求,否则浏览器会直接拦截后续的实际请求
  3. 用这个过滤器的话,就把全局的CORS配置关掉,避免冲突

三、排查其他容易踩的坑

  • 如果部署在IIS上,检查IIS是否开启了自带的CORS模块,要是开了会覆盖你的代码配置,要么关掉IIS的CORS,要么统一用IIS的配置
  • 看看有没有其他过滤器或中间件修改响应头,比如有些日志组件会重置响应头,把你加的CORS头冲掉了
  • 测试的时候清一下浏览器缓存,有时候浏览器会缓存之前的CORS响应,导致测试结果不准

内容的提问来源于stack exchange,提问作者aadi1295

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:32:55