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

.NET Core 6中JWT授权返回400/401错误排查求助

问题排查与修正建议

从你描述的现象(配置OnMessageReceived时400、移除后401)来看,核心问题集中在Token读取逻辑和JWT验证参数匹配上,以下是具体排查点:

1. OnMessageReceived事件中Cookie读取逻辑错误

400错误通常是因为传递给JWT Bearer的Token格式无效,大概率是Cookie读取环节出了问题:

  • 确认读取的Cookie名称和登录时写入的完全一致,比如登录时写的是"JwtToken",就别写成"AccessToken";
  • 必须处理Cookie不存在的情况,避免传递空值给验证逻辑,正确写法示例:
options.Events = new JwtBearerEvents
{
    OnMessageReceived = context =>
    {
        if (context.Request.Cookies.TryGetValue("JwtToken", out var token))
        {
            context.Token = token;
        }
        return Task.CompletedTask;
    }
};

如果没做空值判断,当Cookie意外缺失时,会直接传递空Token触发400错误。

2. JWT生成与验证的核心参数不匹配

移除OnMessageReceived后返回401,说明JWT验证失败,核心是生成Token的参数和Bearer验证参数不一致:

  • 检查Program.cs中JWT Bearer配置的Issuer、Audience、SigningKey,必须和AuthenticationController生成Token时的参数完全一致,示例:
// Program.cs中的验证配置
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "你的Issuer标识", // 必须和生成Token时的Issuer一致
            ValidateAudience = true,
            ValidAudience = "你的Audience标识", // 必须一致
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的签名密钥")) // 必须一致
        };
    });

只要其中任一参数不匹配,验证就会直接失败返回401。

3. Cookie属性配置导致无法携带

登录时写入Cookie的属性可能导致请求时Cookie无法被后端获取:

  • 检查写入Cookie时的Secure、SameSite、Path设置:
// AuthenticationController中写入Cookie的代码
Response.Cookies.Append("JwtToken", token, new CookieOptions
{
    HttpOnly = true,
    SameSite = SameSiteMode.Lax, // 跨域场景需设为None,同时开启Secure
    Secure = builder.Environment.IsProduction(), // 生产环境必须开启,否则Cookie不会被携带
    Expires = DateTime.UtcNow.AddHours(2),
    Path = "/" // 确保Cookie作用域覆盖所有接口路径
});

生产环境未开启Secure、跨域场景SameSite设置错误,都会导致Cookie无法传递到后端,进而触发401。

4. 中间件顺序错误

确认Program.cs中中间件的顺序必须符合以下规则,否则认证逻辑不会生效:

var app = builder.Build();

app.UseStaticFiles();
app.UseRouting();
// 认证必须在授权之前,且在路由之后
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();
app.Run();

如果UseAuthentication()顺序颠倒,会导致认证逻辑未被执行,直接返回401。

5. Authorize特性的Scheme配置冲突

你使用了[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)],如果系统同时启用了Cookie认证方案,需确保Scheme指定正确;若仅需JWT Bearer认证,确认没有额外启用其他认证Scheme导致冲突。


内容的提问来源于stack exchange,提问作者Alexis Abulencia Villar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:19