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

.NET 8+Vue.js集成JWT认证时持续出现401未授权错误求助

解决.NET 8 + Vue JWT认证401 Unauthorized问题

以下是针对你遇到的JWT认证失败问题的具体排查和解决步骤:

1. 开启JWT认证调试日志,定位具体失败原因

在Program.cs的AddJwtBearer配置中添加事件监听,打印认证失败的详细错误信息,这是最直接的排查方式:

.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        // 保持原有配置不变
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        ValidAudience = builder.Configuration["Jwt:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
    };

    // 添加调试日志
    options.Events = new JwtBearerEvents
    {
        OnAuthenticationFailed = context =>
        {
            Console.WriteLine($"认证失败详情: {context.Exception.Message}");
            if (context.Exception.InnerException != null)
            {
                Console.WriteLine($"内部异常: {context.Exception.InnerException.Message}");
            }
            return Task.CompletedTask;
        },
        OnTokenValidated = context =>
        {
            Console.WriteLine("Token验证成功");
            return Task.CompletedTask;
        }
    };
})

运行后端后,调用API时查看控制台输出,就能知道是签名不匹配、受众/发行者错误、token过期还是其他问题。

2. 确认Authorization请求头格式正确

确保前端请求的Authorization头严格遵循Bearer <token>格式:

  • 检查浏览器网络请求的Request Headers,确认Authorization值为Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(Bearer后必须有一个空格,token无多余字符)
  • 避免localStorage中的token被意外添加引号或空格,可在前端代码中对token做trim处理:
Authorization: `Bearer ${localStorage.getItem('token')?.trim()}`

3. 验证JWT密钥的一致性与长度

  • 确保生成token和验证token时使用的密钥完全一致,且编码方式统一(你当前用的Encoding.UTF8.GetBytes是正确的)
  • HmacSha256算法要求密钥至少128位(16字节),你的密钥8D9E3B5F7C2A4E9D1F3C6A7E9B2D4C8F是32个十六进制字符,对应16字节,符合要求,无需修改

4. 调整Program.cs中的服务注册与中间件顺序

  • 将AddControllersWithViews()替换为AddControllers()(API场景更合适):
// 原代码
// builder.Services.AddControllersWithViews();
// 替换为
builder.Services.AddControllers();
  • 确认中间件顺序严格遵循以下顺序(你的当前顺序是正确的,但再次核对):
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowAllOrigins"); // CORS必须在Authentication/Authorization之前
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers(); // 用MapControllers替代MapControllerRoute更适合API

5. 明确指定Authorize的认证方案

在需要认证的Controller或Action上明确指定JWT认证方案,避免潜在的方案冲突:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("api/[controller]")]
[ApiController]
public class TaskController(TaskManagerContext context) : ControllerBase
{
    // ... 原有代码
}

6. 测试HTTPS请求

你的后端启用了UseHttpsRedirection,确保测试时使用HTTPS地址(https://localhost:5251/api/task/upcoming),HTTP请求会被重定向,可能导致请求头丢失或token无效。

按照以上步骤逐一排查,尤其是第一步的调试日志,能快速定位问题根源。

内容的提问来源于stack exchange,提问作者Julio Escudero Cuesta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:31:03