【问题标题】:Verifying a JWT encrypted token with ASP.NET Core 5使用 ASP.NET Core 5 验证 JWT 加密令牌
【发布时间】:2022-02-17 04:17:16
【问题描述】:

在网上搜集了一些零碎的东西并试图让它发挥作用后,我放弃了。

原来是这样:

我有一个带有 RSA-SHA256 签名加密的 OpenID 令牌。 我已经使用 JWT.net 库尝试了以下代码

这是令牌:

eyJhbGciOiJSUzI1NiIsImtpZCI6Ii11Zm0wSEVuMVpSbktHV2ZmQUttd0h0bEV4RSJ9.eyJzdWIiOiJhbG9uIiwiYXVkIjoiMTIzNDUiLCJqdGkiOiJMeVlDeGo4MzNEbHV3V2h0Q0s4OXZmIiwiaXNzIjoiaHR0cHM6Ly8xMC4xNDYuMzIuMTY0OjkwMzEiLCJpYXQiOjE2NDUwMjU4NjYsImV4cCI6MTY0NTAyNjE2NiwiYXV0aF90aW1lIjoxNjQ1MDI1ODY2fQ.KtS1WR3A61uSalUfrwbORx8AcYtsqudj9KlzFmf98W8PbwpSUu0axJmDYjHnH35ltYDjiZgX06RMKOSWQILt2O_4P2T1DtKUz0UOLjW04rpbz-pyOuw6sxQMHOQNUsUt_effojsBB6ISA6ejs-DKx652_M0JYMdZ_GnN2CODJdpZQIYI7xTgaOVrJjjzcxeczcMkGMTryS0qN8U4Pjy9Y4TAVTgSDw3Ca-dw-abwI4oY1aZILDEHglcCVcSMC5Vu6uO1BiLTD7Gc7wbMUi05OPxDrv4xumXVYVDpXhM4kENnoK3_gmGZMQ3SvFWAcFahwR-lyb8gisK8gZZ19PG-Iw

这是我尝试过的最新代码:

 string modulus = "w7Zdfmece8iaB0kiTY8pCtiBtzbptJmP28nSWwtdjRu0f2GFpajvWE4VhfJAjEsOcwYzay7XGN0b-X84BfC8hmCTOj2b2eHT7NsZegFPKRUQzJ9wW8ipn_aDJWMGDuB1XyqT1E7DYqjUCEOD1b4FLpy_xPn6oV_TYOfQ9fZdbE5HGxJUzekuGcOKqOQ8M7wfYHhHHLxGpQVgL0apWuP2gDDOdTtpuld4D2LK1MZK99s9gaSjRHE8JDb1Z4IGhEcEyzkxswVdPndUWzfvWBBWXWxtSUvQGBRkuy1BHOa4sP6FKjWEeeF7gm7UMs2Nm2QUgNZw6xvEDGaLk4KASdIxRQ";
 string exponent = "AQAB";

 try
 {
     IDictionary<string, object> claims = Decode(token, modulus, exponent);
}
catch (SignatureVerificationException ex)
{
     // signature invalid, handle it here
     return false;
}
return true;

private static IDictionary<string, object> Decode(string token, string modulus, string exponent)
{
    var urlEncoder = new JwtBase64UrlEncoder();

    var rsaKey = RSA.Create();
    rsaKey.ImportParameters(new RSAParameters()
        {
            Modulus = urlEncoder.Decode(modulus),
            Exponent = urlEncoder.Decode(exponent)
        });

    var claims = new JwtBuilder()
            .WithAlgorithm(new RS256Algorithm(rsaKey))
            .MustVerifySignature()
            .Decode<IDictionary<string, object>>(token);

    return claims;
}

我收到以下错误:

根据验证程序,签名无效。

现在,我真的不知道这个模数和指数字符串是什么。我只是从某人给出的示例中复制它们,所以我不知道它是否与我的问题有关。

这段代码也没有使用我的密钥。

我自己没有生成令牌。第三方授权服务器正在生成它。

【问题讨论】:

  • ASP.NET Core 5 但似乎缺少公钥是我目前的问题

标签: jwt asp.net-core-mvc .net-5 asp.net-core-5.0


【解决方案1】:

模数和指数是 RSA 密钥的一部分,它基本上是试图从已知值重新创建 RSA 密钥(我不知道它是否像你一样工作)。

无论如何,您可以使用 JwtSecurityTokenHandler 代替 System.IdentityModel.Tokens.Jwt 包中的 JwtSecurityTokenHandler。您所要做的就是直接传递相关参数(实际的 RSA 密钥),如果成功,它将验证并返回有效令牌。像这样的:

SecurityToken validatedToken;
ClaimsPrincipal principal = validator.ValidateToken(jwtToken, GetValidationParameters(), out validatedToken);

这里的验证参数是这样的:

private TokenValidationParameters GetValidationParameters()
        {
            return new TokenValidationParameters
            {
                IssuerSigningKey = GetRSAKey(),
                ValidIssuer = jwtConfig.Issuer,
                ValidAudience = jwtConfig.Audience,
                ValidateIssuerSigningKey = true,
                IssuerSigningKeyResolver = GetMethodToResolveExternalKey(),
                ValidateIssuer = true,
                ValidateAudience = false,
                ValidateLifetime = true,
            };
        }

请注意,签名密钥和签名密钥解析器是不同的技术。如果您在本地拥有密钥,则可以直接传递密钥,但如果您需要在其他地方(如 Azure Key Vault)查找它,则可以传递一个方法,该方法将使用 JWT 令牌中指定的密钥名称调用。

【讨论】:

  • 这两个键...我从哪里得到它们?除了“密钥”之外,授权服务器的管理控制台中没有其他可用的密钥
  • 用于签署原始令牌的密钥在哪里?为此,您需要访问公钥,否则您无法验证令牌。如果它托管在提供令牌的服务的端点上,那么您将需要获取(可能来自 jwks 端点),然后从 base64 转换回密钥。
  • 我会问他们我从哪里得到的。
  • 我是否还需要私钥来验证它?我在您的代码中没有看到任何用法。
  • 不,只有公钥用于验证。
猜你喜欢
  • 2020-08-22
  • 2020-09-04
  • 2020-07-01
  • 2019-10-20
  • 2021-12-17
  • 2017-01-03
  • 2021-06-27
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多