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

Wil*_*lem 7 c# asp.net-mvc jwt

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

我在它之后执行的下一个请求(从 start.inclusion 开始整个过程​​,获取新的 accesstoken,因为不支持刷新令牌)我收到“idx10503 签名验证失败”。令牌没有孩子'。我无法理解它。JWT.io 调试器表示签名有效。

如果验证失败后我发出新请求(再次启动整个过程),则 JWT 有效。

因此,为了清楚起见,它看起来像这样:

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

我验证 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;
            }
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*lem 5

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

TryAllIssuerSigningKeys = true,
IssuerSigningKey = new RsaSecurityKey(rsa),
IssuerSigningKeys = new List<SecurityKey>() { new RsaSecurityKey(rsa) }
Run Code Online (Sandbox Code Playgroud)