You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 09:25:31