You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:50:26