ASP.NET Core Web API中Authorize特性始终返回401错误排查
解决ASP.NET Core JWT认证返回401的排查思路
- 修正中间件顺序
你当前的中间件顺序不符合ASP.NET Core的执行规则,正确顺序要求UseRouting在前,UseAuthentication必须放在UseRouting之后、UseAuthorization之前,修正后的Configure代码如下:
app.UseHttpsRedirection(); app.UseRouting(); // 认证中间件必须放在路由之后、授权之前 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
- 检查请求头格式
请求的Authorization头必须符合Bearer {你的Token}格式,注意Bearer和Token内容之间必须有一个空格,不能直接只传Token字符串。 - 验证JWT配置一致性
确认认证配置中用到的jwtConfig.Issuer、jwtConfig.Audience、jwtConfig.Secret三个参数,和生成Token时注入的_jwtconfig对应值完全一致,无大小写差异、多余空格或配置读取错误的问题。 - 匹配HTTPS配置
你配置了RequireHttpsMetadata = true,该配置要求请求必须走HTTPS协议,如果本地调试用的是HTTP地址,会直接验证失败,本地测试可临时改为false,生产环境再开启即可。 - 调整时间校验规则
你设置了ClockSkew = TimeSpan.Zero,代表完全不允许服务器时间有任何偏差,如果服务器时间不准确,或者Token生成后已经超过15分钟有效期,都会直接验证失败。可以临时调整ClockSkew为TimeSpan.FromMinutes(5)允许小范围时间偏差,同时确认使用的Token未过期。 - 检查Authorize特性配置
确认接口上的[Authorize]特性没有指定其他非JWT的认证方案,如果指定了非默认的方案,也会导致认证不通过。 - 开启调试日志定位问题
在appsettings.json的Logging配置中添加以下配置,开启JWT认证的调试日志,可直接看到验证失败的具体原因(比如签名无效、颁发者不匹配、Token过期等):
"Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication.JwtBearer": "Debug" } }
内容的提问来源于stack exchange,提问作者Tabris
相关产品推荐
相关产品推荐

