.NET Core 2 Web API JWT Token不被识别,授权验证失败求助
我之前也碰到过类似的JWT授权踩坑经历,结合你描述的情况——Token生成正常但请求时Identity无法填充、带[Authorize]返回404、不带时User.Identity.IsAuthenticated为false,给你几个针对性的排查方向:
确认中间件注册与管道顺序
这是最容易踩的坑!一定要保证身份验证相关的配置在授权之前,管道执行顺序也不能乱:// 服务注册顺序 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 你的JWT配置:ValidIssuer、ValidAudience、IssuerSigningKey等必须和生成Token时一致 }); builder.Services.AddAuthorization(); // 管道执行顺序 app.UseAuthentication(); // 先验证身份 app.UseAuthorization(); // 再做授权判断如果顺序反过来,授权逻辑会先执行,此时Identity还没被填充,自然会验证失败。
校验Token内容与配置匹配度
用JWT.io解析你的Token,重点检查这几个字段:iss(签发者)、aud(受众)必须和你在AddJwtBearer里配置的ValidIssuer、ValidAudience完全一致;exp(过期时间)是否在有效期内;- 生成Token时是否添加了必要的Claim(比如
ClaimTypes.NameIdentifier、ClaimTypes.Name),这些Claim是填充Identity的关键。
检查请求头格式正确性
即使你确认Token没问题,也要再核对请求头:必须是Authorization: Bearer <你的Token>,注意Bearer后面有一个空格!很多时候手动输入会漏这个空格,导致JWT中间件识别不到Token。Postman里建议直接在「Authorization」标签选择「Bearer Token」,粘贴Token后自动生成正确请求头,避免手动错误。排查
[Authorize]与路由的关联问题
你提到添加[Authorize]后返回404,这可能不是授权失败,而是路由未匹配!先去掉[Authorize],用Postman调用该接口确认能正常返回200。如果没问题,再尝试给[Authorize]指定授权Scheme:[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]强制接口使用JWT授权,避免其他授权Scheme干扰。
启用调试日志定位根因
给身份验证模块开启Debug级日志,能直接看到Token解析、验证的全过程:builder.Logging.AddFilter("Microsoft.AspNetCore.Authentication", LogLevel.Debug);运行程序后查看控制台日志,你会看到诸如「Token签名验证失败」「Issuer不匹配」「Token已过期」等具体错误信息,这是定位问题最直接的方式。
纠正Identity属性的误用
你提到的User.Identity.IsAuthorized应该是IsAuthenticated吧?IsAuthenticated才是判断用户是否通过身份验证的属性,如果它为false,说明身份验证环节根本没通过,优先排查前面的Token和中间件配置问题。
内容的提问来源于stack exchange,提问作者atfergs

