jwt鉴权需正确注册addjwtbearer()并配置tokenvalidationparameters,否则[authorize]静默返回401;必须显式启用validateissuersigningkey、validateissuer、validateaudience、validatelifetime;密钥类型与算法须严格匹配hs256/rsa,issuer/audience字符串须逐字符一致。

JWT 鉴权在 C# Web API 中不是“加个 [Authorize] 就完事”,而是必须先让认证中间件真正跑起来,否则所有请求都会静默返回 401,且不报任何配置错误。
为什么 [Authorize] 加了但始终 401?
最常见原因是 AddJwtBearer() 根本没注册,或者注册位置错了。ASP.NET Core 6+ 默认不启用任何认证方案,AddAuthentication() 单独调用无效,必须链式接 AddJwtBearer()。
-
AddJwtBearer()必须在AddControllers()之后、Build()之前调用,顺序错会导致服务未注入 - 漏掉
app.UseAuthentication()中间件(必须在UseAuthorization()之前) -
DefaultAuthenticateScheme没设成JwtBearerDefaults.AuthenticationScheme,导致[Authorize]不知道该用哪个 scheme
TokenValidationParameters 哪些开关必须显式设为 true?
默认全为 false,生产环境不手动打开等于裸奔。关键验证项必须显式赋值,不能依赖默认值:
-
ValidateIssuerSigningKey = true:否则任意字符串都能伪造签名 -
ValidateIssuer = true且ValidIssuer必须和 token 中的iss字段**逐字符一致**(含协议、斜杠、大小写) -
ValidateAudience = true且ValidAudience必须和 token 中的aud完全匹配(比如"https://api.example.com"≠"api.example.com") -
ValidateLifetime = true:否则过期 token 仍能通过
少开一个,就可能让无效或恶意 token 绕过校验。
生成 token 时 SigningCredentials 怎么配才不报错?
运行时报 ArgumentException: IDX10623 或编译失败,基本是密钥类型/算法不匹配:
- 用 HS256 就必须配
SymmetricSecurityKey,传入字节数组(至少 32 字节),别直接传字符串 - 用 RS256 就必须配
RSA实例(new RsaSecurityKey(rsa)),混用SymmetricSecurityKey必炸 -
SigningCredentials构造时指定的算法(如SecurityAlgorithms.HmacSha256)必须和AddJwtBearer中TokenValidationParameters.ValidateAlgorithm一致 - 生成 token 时不要填
encryptingCredentials参数——JWE 加密是另一套逻辑,Web API 普遍只需 JWS 签名
为什么 HttpContext.User.Identity.IsAuthenticated 总是 false?
这不是代码 bug,而是 issuer/audience 字符串不精确匹配。JWT 解析成功但验证失败时,.NET 不抛异常,只静默拒绝,IsAuthenticated 就是 false。
- 检查 token payload 里的
iss和aud(用 jwt.io 解码),和ValidIssuer/ValidAudience配置值逐字符比对 - 注意末尾斜杠:
"https://auth.example.com/"≠"https://auth.example.com" - 注意协议头:
"auth.example.com"≠"https://auth.example.com" - 注意大小写:
"MyApp"≠"myapp"
这个匹配是严格字符串比较,没有任何容错或 trim,最容易被忽略也最难排查。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










