.NET为何忽略POST请求的CORS策略?预检请求未通过检查
.NET CORS策略被忽略的原因及解决方法
核心原因分析
你的POST请求触发了浏览器预检(OPTIONS)请求,但该请求未被CORS中间件正确处理,导致响应缺少Access-Control-Allow-Origin头。而isOriginAllowed未被调用,说明CORS中间件根本没参与到请求处理流程中,常见原因如下:
1. 未在ConfigureServices中注册CORS服务
.NET Core中必须先通过AddCors()注册CORS服务,否则UseCors中间件不会生效。如果你的Startup.cs或Program.cs中没有注册该服务,CORS策略会被直接忽略:
services.AddCors();
2. 预检请求被授权中间件拦截
预检请求(OPTIONS)是浏览器自动发送的,不会携带认证信息。若你的授权策略强制要求所有请求必须认证,会直接拒绝OPTIONS请求,导致CORS头无法被添加到响应中。
3. 自定义中间件提前处理了OPTIONS请求
如果有自定义中间件在UseCors之前就处理了OPTIONS请求并返回响应,CORS中间件将没有机会介入处理,自然不会添加所需的CORS头。
解决步骤
- 注册CORS服务
在ConfigureServices(或Program.cs的服务配置段)添加CORS服务注册:
services.AddCors();
- 放行预检请求
在授权配置中针对OPTIONS请求添加允许匿名访问的规则,避免被授权中间件拦截:
services.AddAuthorization(options => { options.AddPolicy("AllowPreflight", policy => policy.AllowAnonymous()); }); // 在UseCors之后、UseAuthentication之前添加处理逻辑 app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowCredentials().SetIsOriginAllowed(_ => true)); app.Use(async (context, next) => { if (context.Request.Method == HttpMethod.Options.Method) { context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.CompleteAsync(); return; } await next(); }); app.UseAuthentication(); app.UseAuthorization();
- 排查自定义中间件
检查是否有中间件在UseCors之前处理了OPTIONS请求,若有则调整中间件顺序或移除相关逻辑,确保CORS中间件能优先处理预检请求。
验证方法
- 调试时跟踪OPTIONS请求的处理流程,确认CORS中间件是否被执行。
- 用Postman直接发送OPTIONS请求,检查响应头是否包含
Access-Control-Allow-Origin等CORS相关字段。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

