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

.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头。

解决步骤

  1. 注册CORS服务
    在ConfigureServices(或Program.cs的服务配置段)添加CORS服务注册:
services.AddCors();
  1. 放行预检请求
    在授权配置中针对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();
  1. 排查自定义中间件
    检查是否有中间件在UseCors之前处理了OPTIONS请求,若有则调整中间件顺序或移除相关逻辑,确保CORS中间件能优先处理预检请求。

验证方法

  • 调试时跟踪OPTIONS请求的处理流程,确认CORS中间件是否被执行。
  • 用Postman直接发送OPTIONS请求,检查响应头是否包含Access-Control-Allow-Origin等CORS相关字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:03:11