.NET 7 API返回401时出现CORS错误的解决求助
修复.NET 7.0中过期Token请求的CORS错误问题
你的问题核心在于:当自定义中间件直接返回401 Unauthorized时,没有正确添加CORS响应头,导致浏览器触发CORS拦截,前端Axios无法获取到响应对象。以下是具体修复步骤:
1. 清理冗余的CORS源配置
你的CORS策略里重复添加了带斜杠和不带斜杠的本地地址,这会导致匹配异常,先统一修正:
builder.Services.AddCors(options => { options.AddPolicy("CorsPolicy", cors => cors.WithOrigins("http://localhost:3000") // 去掉冗余的带斜杠地址 .AllowCredentials() .AllowAnyHeader() .AllowAnyMethod()); });
2. 修改自定义中间件,确保返回401时添加CORS头
当前你的AccessTokenValidatorMiddleware在Token过期时直接设置响应状态码,但没有触发CORS策略的响应头写入逻辑。需要在返回401前手动应用CORS策略:
首先更新中间件的构造函数,注入CORS相关服务:
using System.Net; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Cors.Infrastructure; // 新增命名空间 namespace CleanTunedApp.Common.Authentication { public class AccessTokenValidatorMiddleware : IMiddleware { private readonly IAccessTokenService _accessTokenService; private readonly ICorsPolicyProvider _corsPolicyProvider; private readonly ICorsService _corsService; // 注入CORS服务 public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, ICorsPolicyProvider corsPolicyProvider, ICorsService corsService) { _accessTokenService = accessTokenService; _corsPolicyProvider = corsPolicyProvider; _corsService = corsService; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { if (await _accessTokenService.IsCurrentActiveToken()) { await next(context); return; } // 先应用CORS策略到响应 var corsPolicy = await _corsPolicyProvider.GetPolicyAsync(context, "CorsPolicy"); if (corsPolicy != null) { var corsResult = _corsService.EvaluatePolicy(context, corsPolicy); _corsService.ApplyResult(corsResult, context.Response); } // 再设置401状态码 context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; } } }
3. 确认中间件注册顺序
你的中间件顺序是正确的,保持当前顺序即可:
app.UseHttpsRedirection(); app.UseCors("CorsPolicy"); // 必须在认证类中间件之前 app.UseAuthentication(); app.UseAccessTokenValidator(); app.MapControllers();
修复逻辑说明
当自定义中间件直接终止请求管道(不调用next(context))时,后续的CORS响应头处理逻辑不会自动执行。通过手动获取并应用CORS策略,能确保即使返回401,响应也包含浏览器所需的CORS头,前端Axios就能正常捕获到401响应,进而执行Token刷新逻辑。
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

