IdentityServer4生成JWT在JwtSecurityTokenHandler验证通过但jwt.io失败
IdentityServer4生成JWT的验证问题
我们使用IdentityServer4生成的JWT Token可被Token中间件验证通过,但在jwt.io平台验证失败。已尝试通过PEM和JWK两种方式在jwt.io验证,均失败。使用配置相同的IdentityServer3实例生成的Token则可正常验证,但两者的JWK格式不同——IdentityServer3的JWK无x5c/x5t字段。
现咨询以下问题:
- 有无其他工具可排查验证失败原因?
- JWK格式差异(x5t/x5c)是否与此问题相关?能否配置IdentityServer4返回旧格式JWK?
- 其他排查思路?
为脱离中间件验证Token,编写了如下代码片段:
var jwksJson = @"{ ""keys"": [ { ""kty"": ""RSA"", ""use"": ""sig"", ""kid"": ""0313B7152576EF7415003F309C7E7F5EABADD0B7RS256"", ""x5t"": ""AxO3FSV273QVAD8wnH5_Xqut0Lc"", ""e"": ""AQAB"", ""n"": ""3FOm0...J0"", ""x5c"": [ ""MI....="" ], ""alg"": ""RS256"" } ]}"; var token = "ey...ktYx7QBZw"; var jwks = new JsonWebKeySet(jwksJson); var jwk = jwks.Keys.First(); var validationParameters = new TokenValidationParameters { IssuerSigningKey = jwk, ValidateLifetime = false, ValidateAudience = true, ValidateIssuer = true, ValidateIssuerSigningKey = true, ValidAudiences = new []{"aaaa","bbbb","ccc"}, // 你的API受众,可通过设置ValidateAudience=false关闭验证 ValidIssuer = "https://dev.xxxx.xxxx.com" // Token发行方,可通过设置ValidateIssuer=false关闭验证 }; WritePem(jwk); if (ValidateToken(token, validationParameters)) { Console.WriteLine("Token Valid"); } else { Console.WriteLine("Token Invalid"); } static bool ValidateToken(string token, TokenValidationParameters validationParameters) { var tokenHandler = new JwtSecurityTokenHandler(); try { tokenHandler.ValidateToken(token, validationParameters, out var validatedToken); return validatedToken != null; } catch (Exception e) { Console.WriteLine(e); return false; } } static void WritePem(JsonWebKey jsonWebKey) { var key = new RSACryptoServiceProvider(); key.ImportParameters(new RSAParameters { Modulus = Base64Url.Decode(jsonWebKey.N), Exponent = Base64Url.Decode(jsonWebKey.E) }); var pubkey = Convert.ToBase64String(key.ExportSubjectPublicKeyInfo()); const string pemHeader = "-----BEGIN PUBLIC KEY-----"; const string pemFooter = "-----END PUBLIC KEY-----"; var publicKeyPem = pemHeader + Environment.NewLine + pubkey + Environment.NewLine + pemFooter; Console.WriteLine(publicKeyPem); }
内容的提问来源于stack exchange,提问作者Manuel Amstutz
相关产品推荐
相关产品推荐

