ASP.NET Identity JWT授权异常:获取Token后访问接口返回401
ASP.NET Core JWT授权401错误排查方案
问题概述
- 登录流程正常,能获取预期JWT Token
- 携带Token访问带
[Authorize]特性的/api/Blogs端点时,返回401 Unauthorized - Postman响应头显示
Bearer error="invalid_token" - Swagger、Postman按规范设置Bearer Token后均无效
排查修复步骤
1. 核对JWT配置一致性
检查appsettings.json中的JWT配置项(AccessTokenKey、Issuer、Audience),确保与代码中读取的内容完全一致(包括大小写、空格、特殊字符):
- 重点:
AccessTokenKey长度需满足HmacSha256算法要求,至少32个字符(256位),密钥过短会直接导致签名验证失败。
2. 修正请求管道与CORS配置
- 确认
app.UseAuthentication()在app.UseAuthorization()之前执行(当前代码顺序正确,无需调整) - 修改CORS配置,确保允许
Authorization请求头,同时移除Origin地址末尾的斜杠:app.UseCors(policy => policy.WithOrigins("http://localhost:3000", "https://localhost:3001") .AllowAnyMethod() .AllowAnyHeader() );
3. 验证Token生成逻辑
- 对比
TokenService与Program.cs中使用的Issuer、Audience、密钥是否完全一致 - 解析生成的Token,检查
iss、aud、exp等字段是否符合配置预期,确认签名算法为HmacSha256
4. 启用认证日志定位具体错误
在JWT认证配置中添加事件处理,输出详细错误信息:
.AddJwtBearer(options => { options.SaveToken = true; options.RequireHttpsMetadata = false; options.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, ValidateAudience = true, ValidateIssuerSigningKey = true, ValidateLifetime = true, ValidIssuer = builder.Configuration["JWT:Issuer"], ValidAudience = builder.Configuration["JWT:Audience"], IssuerSigningKey = new SymmetricSecurityKey(key) }; options.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { Console.WriteLine($"认证失败: {context.Exception.Message}"); return Task.CompletedTask; }, OnChallenge = context => { Console.WriteLine($"挑战失败: {context.ErrorDescription}"); return Task.CompletedTask; } }; });
运行程序后查看控制台日志,直接获取无效Token的具体原因(如签名无效、issuer不匹配、Token过期等)
5. 优化Swagger配置
调整Swagger的安全定义为标准Bearer格式,方便测试:
builder.Services.AddSwaggerGen(options => { options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "请输入格式为 `Bearer {Token}` 的授权令牌", Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "Bearer" }); options.OperationFilter<SecurityRequirementsOperationFilter>(); });
关键代码验证点
- Program.cs:默认认证Scheme设置为
JwtBearerDefaults.AuthenticationScheme,TokenValidationParameters参数与Token生成逻辑完全匹配 - TokenService:使用相同的密钥、Issuer、Audience生成Token,签名算法为
SecurityAlgorithms.HmacSha256
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

