.NET 6部署Azure后CORS报错:无Access-Control-Allow-Origin响应头
问题详情
报错信息:
Access to fetch at '{mybaseurlapi}/api/Comptes/Connexion' from origin '{mybaseurlclient}' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
API的Program.cs配置:
... builder.Services.AddCors(o => o.AddPolicy("Epicerie", builder => { builder .WithOrigins("https://epicerieclient20231122200526.azurewebsites.net") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); })); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseCors("Epicerie"); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
已尝试的无效操作:
- 将
app.UseCors("Epicerie")移至UseRouting之后 - 使用
[EnableCors("Epicerie")]替代全局中间件 - 配置允许任意来源的CORS策略:
AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()
解决方案
1. 检查Azure App Service层面的CORS配置
Azure App Service自带的CORS配置会覆盖代码中的设置,这是部署后CORS失效的常见原因:
- 登录Azure门户,找到你的API对应的App Service
- 进入左侧菜单的「CORS」选项
- 确认是否已添加客户端的完整域名(包括
https://前缀,无末尾斜杠),测试阶段可临时勾选「允许所有来源」验证 - 若此处配置了规则,代码中的CORS策略会被忽略,需保持两边配置一致或统一使用App Service的CORS设置
2. 修正中间件执行顺序
ASP.NET Core中间件顺序严格决定执行逻辑,正确的CORS中间件位置必须满足:
app.UseHttpsRedirection(); app.UseRouting(); // CORS必须在UseRouting之后,UseAuthentication/UseAuthorization之前 app.UseCors("Epicerie"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
之前的代码中UseCors在UseRouting之前,会导致CORS头无法正确添加到路由匹配后的请求中。
3. 排查重定向导致的CORS头丢失
如果API存在重定向(比如Azure App Service强制HTTPS但配置冲突),重定向后的响应可能丢失CORS头:
- 使用浏览器开发者工具的「网络」标签,查看请求的状态码,若出现3xx重定向,检查目标地址是否正确
- 确保
UseHttpsRedirection()配置正确,且Azure App Service的「TLS/SSL设置」中已开启「HTTPS only」
4. 验证Credentials请求的兼容性
如果客户端请求使用了credentials: 'include'(如携带Cookie、认证令牌):
- 不能使用
AllowAnyOrigin(),必须明确指定WithOrigins包含客户端域名 - 确保策略中开启
AllowCredentials() - 客户端域名必须与配置完全一致(大小写、协议、端口都要匹配,无末尾斜杠)
5. 排查自定义中间件或过滤器的干扰
检查是否存在自定义中间件(如异常处理、日志中间件)在CORS中间件之前返回响应,导致CORS头未被添加:
- 暂时注释非必要的自定义中间件,测试CORS是否正常
- 确认全局过滤器没有修改或移除响应头
内容的提问来源于stack exchange,提问作者mathdx

