【问题标题】:JWT Token valid by JwtSecurityTokenHandler but no valid by JWT.IO - IdentityServer4JWT 令牌对 JwtSecurityTokenHandler 有效但对 JWT.IO 无效 - IdentityServer4
【发布时间】:2022-10-25 15:34:44
【问题描述】:

我们使用 IdentityServer4,生成的令牌被令牌中间件接受。 但是 jwt.io 上的令牌验证失败

我已经尝试使用 PEM 和 JWK 在 jwt.io 上进行验证。两者都失败了。 正如这里所假设的那样:Other question

如果我对另一个 IdentiyServer 实例执行相同的操作但配置相同 (IdentityServer3) 它可以工作,但 JWK 看起来不同。 (没有 x5c / c5t)

  • 是否有其他工具可以检查验证失败的原因?
  • 其他 JWK 格式是否与此相关 (x5t / x5c)?如果是这样,我可以配置 IdentyServer 以返回“旧格式”吗?
  • 还有其他想法吗?

为了在没有中间件的情况下检查令牌,我写了这段代码:

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"}, // Your API Audience, can be disabled via ValidateAudience = false
    ValidIssuer = "https://dev.xxxx.xxxx.com"  // Your token issuer, can be disabled via 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);
}

【问题讨论】:

  • 确保您的客户端的 AccessTokenType 是 JWT。

标签: c# jwt identityserver4 jwk


【解决方案1】:

我创建了一个新证书,现在可以使用了。我不知道为什么旧证书不起作用。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 2021-06-01
    • 2021-04-13
    • 2017-07-07
    • 2021-09-25
    • 2018-07-14
    • 2020-04-19
    • 2016-10-20
    • 2018-04-11
    相关资源
    最近更新 更多