发布后IIS上ASP.NET Core Web API遭CORS策略拦截无法运行
直接梳理关键问题点并给出修正方案:
1. 移除Angular请求中错误的请求头
你在httpOptions里添加的Access-Control-Allow-Origin和Access-Control-Allow-Methods是服务器返回给客户端的响应头,不是客户端请求时该携带的头。添加这些不仅无效,还可能干扰预请求逻辑。直接删除这两个头:
// 修正后的请求头配置,仅保留业务必要项 let httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
2. 让Angular请求走代理配置
你已配置代理,但请求直接使用完整API地址http://localhost:7173/login/login,等于绕开了代理。改用相对路径,让代理自动转发:
// 使用相对路径,代理会自动转发到目标API地址 this.http.post<string>('/login/login', this.user, httpOptions) .subscribe(results => { console.log(results); }, error => console.log(error));
启动Angular项目时,确保通过ng serve --proxy-config proxy.conf.json(对应你的代理文件名)启动,或在angular.json的serve配置中指定proxyConfig路径,保证代理生效。
3. 修正ASP.NET Core的CORS配置顺序与策略
调整中间件顺序
app.UseCors必须放在正确的执行顺序上,确保在路由和授权中间件之前运行:
var builder = WebApplication.CreateBuilder(args); var MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; builder.Services.AddCors(options => { options.AddPolicy(name: MyAllowSpecificOrigins, builder => { // 注意:AllowAnyOrigin()与AllowCredentials()同时使用会触发浏览器限制,需指定明确源 builder.WithOrigins("http://localhost:44413") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); // 其他服务注册(如AddControllers、AddDbContext等) builder.Services.AddControllers(); var app = builder.Build(); // 严格遵循中间件顺序 app.UseHttpsRedirection(); // 若有静态文件中间件,放在CORS之前 // app.UseStaticFiles(); app.UseCors(MyAllowSpecificOrigins); // 必须在UseRouting和UseAuthorization之前 app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.Run();
解决通配符与凭证的冲突
当启用AllowCredentials()时,浏览器不允许服务器返回Access-Control-Allow-Origin: *,因此必须明确指定允许的源地址。若需支持多个源,可扩展为WithOrigins("http://localhost:44413", "https://你的生产域名.com")。
4. 验证发布后的API配置
发布后可通过curl或Postman发送OPTIONS预请求,检查响应头是否包含正确的CORS字段:
curl -X OPTIONS http://localhost:7173/login/login -H "Origin: http://localhost:44413" -H "Access-Control-Request-Method: POST"
若响应头中存在Access-Control-Allow-Origin、Access-Control-Allow-Methods等字段,说明服务器配置生效;若不存在,检查发布后的appsettings.json是否覆盖了CORS配置,或是否有其他中间件(如URL重写)拦截了请求。
内容的提问来源于stack exchange,提问作者Bahman

