其他所有请求 JWT 验证都失败,并显示“idx10503 签名验证失败”。令牌没有孩子'

时间:2021-05-11 10:29:57

标签: c# asp.net-mvc jwt

所以整个 JWT 签名和验证对我来说都是全新的。我现在有一个 C# 应用程序,它通过使用 JWT 保护的 API 请求一些信息。奇怪的是,所有其他请求都失败了。所以第一个请求就像一个魅力。我得到了我期望的信息和回复。 JWT 验证成功。

我在它之后执行的下一个请求(启动整个流程表单开始。包括获取新的访问令牌,因为不支持刷新令牌)我收到“idx10503 签名验证失败”。令牌没有孩子'。我无法理解它。 JWT.io 调试器说签名有效。

如果在验证失败后我做了一个新的请求(再次开始整个过程​​),则 JWT 是有效的。

所以,为了清楚起见,它看起来像这样:

  • 请求 1,JWT 验证成功。
  • 请求 2,JWT 验证失败。
  • 请求 3,JWT 验证成功。
  • 请求 4,JWT 验证失败。

我验证 JWT 并得到错误的部分如下:

            try
            {
                var keyBytes = Convert.FromBase64String(publicKey);

                AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes);
                RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
                RSAParameters rsaParameters = new RSAParameters
                {
                    Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(),
                    Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned()
                };

                using (var rsa = new RSACryptoServiceProvider())
                {
                    rsa.ImportParameters(rsaParameters);
                    var validationParameters = new TokenValidationParameters()
                    {
                        RequireExpirationTime = true,
                        RequireSignedTokens = true,
                        ValidateAudience = false,
                        ValidateIssuer = false,
                        IssuerSigningKey = new RsaSecurityKey(rsa)
                    };
                    var handler = new JwtSecurityTokenHandler();

                    handler.ValidateToken(jwtToken, validationParameters, out var validatedToken);                    
                }

                return validatedToken;
            }
            catch (Exception e)
            {
                throw e;
            }

我已经尝试过将 RSAParameters 放在缓存中并在下一个请求中使用这些相同的参数是否会有所不同。不幸的是,这让我的情况变得更糟,因为所有接下来的 JWT 验证都失败了。

有人知道可能会出什么问题吗?

2 个答案:

答案 0 :(得分:0)

通过向validationParameters添加一些参数最终解决了我的问题;

TryAllIssuerSigningKeys = true,
IssuerSigningKey = new RsaSecurityKey(rsa),
IssuerSigningKeys = new List<SecurityKey>() { new RsaSecurityKey(rsa) }

答案 1 :(得分:0)

对于遇到此问题的其他任何人,这是因为我安装了来自 Nuget 的最新 Microsoft.Data.Sqlclient,它还安装了旧版本 System.Identity.Model 的依赖项。我卸载了 Microsoft.Data.Sqlclient Nuget 包,它又开始工作了。

这里的教训是始终阅读 Nuget 告诉您的有关安装软件包时它在做什么的信息!