Microsoft.IdentityModel.JsonWebTokens 通过 JsonWebTokenHandler 和 TokenValidationParameters 对象创建并验证 JWT;ASP.NET Core 中的 AddJwtBearer 让请求都经由它处理,因此它的默认设置就是大多数 .NET API 的默认设置。8.23.0 对 HS、RS、PS 和 ES 系列的签名与验证均成功;该包中没有 EdDSA 的安全密钥类型。
ValidAlgorithms 默认为 null,由密钥决定:用 EC 密钥验证 RS256 令牌和用该 EC 密钥的 PEM 文本伪造的 HS256 令牌时,都报错 IDX10517: Signature validation failed.;除非把 RequireSignedTokens 设为 false,否则未签名的令牌会报错 IDX10504。缺口在于曲线绑定:用 P-384 密钥也能签出 ES256 令牌,同一个处理程序还会让它验证通过,而其他库——jose、PyJWT、golang-jwt——都会拒绝。应像示例那样设置 ValidAlgorithms,并使用长度正确的密钥。
有效期规则与大多数库正好相反:exp 是必需的(IDX10225),而 TokenValidationParameters.DefaultClockSkew 为五分钟,因此令牌过期后最多五分钟内仍然可用。对短期访问令牌来说,这个容差相当宽松;应显式设置 ClockSkew。即使没有设置 Expires,CreateToken 也会添加 exp。
ES256 签名是 JWS 要求的 64 字节原始 r‖s,与 .NET 自身 ECDsa 的默认格式一致;DER 签名会报出与伪造签名相同的 IDX10517。除非在调试时启用 IdentityModelEventSource.ShowPII,否则错误信息会把令牌内容隐藏为 [PII of type ... is hidden]——可以改用 JWT 调试器解码令牌,并用 JWKS 检测检查提供商的密钥。