已配置CORS仍报错:请求资源无Access-Control-Allow-Origin头
解决CORS策略阻止请求的问题
你的核心问题是ASP.NET Core中间件顺序配置错误,CORS中间件必须放在正确的执行位置才能生效,按以下步骤修正:
1. 调整中间件执行顺序
ASP.NET Core中间件的执行顺序直接影响功能生效,UseCors需要满足:
- 在
UseRouting之后(路由解析完成后才能匹配CORS策略) - 在
UseAuthentication、UseAuthorization之前(跨域预检请求需要在认证前完成处理) - 在端点映射(
MapControllers等)操作之前
同时你代码中重复调用了UseHttpsRedirection,需移除重复项。
修正后的Program.cs关键代码:
var app = builder.Build(); app.UseWatchDogExceptionLogger(); // 开发环境配置 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(opts => { opts.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); }); } app.UseHttpsRedirection(); app.UseResponseCaching(); app.UseRouting(); // CORS中间件放在此处:路由之后,认证授权之前 app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.UseIpRateLimiting(); // 端点映射需在所有中间件配置完成后执行 app.MapControllers(); app.MapHealthChecks("/health", new HealthCheckOptions { ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }); app.MapHealthChecksUI(); app.UseWatchDog(opts => { opts.WatchPageUsername = app.Configuration.GetValue<string>("WatchDog:Username"); opts.WatchPagePassword = app.Configuration.GetValue<string>("WatchDog:Password"); opts.Blacklist = "health"; }); app.Run();
2. React请求代码优化(可选)
你的React代码中无需手动用JSON.stringify序列化参数,axios会自动处理对象序列化,简化代码同时避免潜在格式问题:
async function handleSubmit(e) { e.preventDefault(); try { const response = await axios.post( "https://localhost:7078/api/v1/Authentication/token", { userName, password }, // 直接传入对象,无需JSON.stringify { headers: { "Content-type": "application/json", }, } ); console.log(response.data); } catch (err) { console.error(err.response?.data || err.message); // 捕获错误便于排查问题 } }
3. 额外排查方向
如果调整顺序后仍存在问题:
- 确认API项目的HTTPS配置正常,React请求的URL(协议、端口)与API运行地址完全匹配
- 检查WatchDog、IP限流等中间件是否修改或拦截了CORS响应头
- 在浏览器开发者工具的Network标签中,查看预检OPTIONS请求的响应头,确认是否包含
Access-Control-Allow-Origin字段
内容的提问来源于stack exchange,提问作者stepup.stepout
相关产品推荐
相关产品推荐

