ASP.NET 6中仅为GET请求启用CORS遇到问题
问题分析与解决:仅允许GET请求的CORS配置无效
这不是Bug,是对ASP.NET Core CORS验证逻辑的误解,原因和解决方法如下:
核心原因
CORS的验证分两种场景:
- 预检请求(OPTIONS):仅针对非简单请求触发,比如Content-Type为
application/json的POST请求、带自定义头的请求等。此时CORS中间件会严格验证请求方法是否在允许列表中。 - 简单请求:如果你的POST请求满足「Content-Type是
application/x-www-form-urlencoded、multipart/form-data或text/plain」,属于简单请求,浏览器不会发送预检,直接发送请求。ASP.NET Core的CORS中间件此时只会验证请求Origin是否合法,不会校验请求方法,所以POST请求会正常返回,前端也不会触发CORS错误。
解决方法
方法1:让POST请求触发预检
在前端发起POST请求时,设置Content-Type为非简单请求的类型(比如application/json),示例:
fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({}) });
此时浏览器会发送OPTIONS预检请求,CORS中间件会发现POST不在允许的方法列表中,直接拒绝请求,前端就会触发预期的CORS错误。
方法2:手动拦截非GET的跨域请求
如果需要对所有跨域请求严格校验方法,可以在接口中添加逻辑:
app.MapPost("/", (HttpContext context) => { var origin = context.Request.Headers.Origin.ToString(); // 验证Origin是否在允许列表,且请求方法为GET if (origin == "https://customsite.com" && context.Request.Method != "GET") { context.Response.StatusCode = StatusCodes.Status403Forbidden; return "跨域请求仅支持GET方法"; } return "Hello World!"; });
代码优化建议
你代码中调用了两次UseCors,这会导致CORS中间件被重复添加,建议只保留一种配置方式:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddCors(options => { options.AddPolicy("customPolicy", policy => { policy.WithOrigins("https://customsite.com").WithMethods("GET"); }); }); var app = builder.Build(); // 只保留一个UseCors配置 app.UseCors("customPolicy"); app.MapPost("/", () => "Hello World!"); app.Run();
内容的提问来源于stack exchange,提问作者Yossi Sternlicht
相关产品推荐
相关产品推荐

