Проверка подписи JWT ASP.NET C # - PullRequest
0 голосов
/ 21 марта 2019

Я очень новичок в JWT и проводил исследования по этому вопросу, но не смог найти правильного решения. У меня есть JWT, срок его действия уже истек, но когда я проверяю подпись на JWT.IO с помощью открытого ключа, он проверяется. Алгоритм RS256. Когда я нахожусь на JWT.io, я обертываю открытый ключ с помощью «--- BEGIN CERTIFICATE ----» и «--- END CERTIFICATE ----», и он проверяет JWT.

Теперь я пытаюсь сделать то же самое на C #, используя следующую функцию:

public  string Decode(string token, string key, bool verify = true)
        {
            string[] parts = token.Split('.');
            string header = parts[0];
            string payload = parts[1];
            byte[] crypto = Base64UrlDecode(parts[2]);

            string headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header));
            JObject headerData = JObject.Parse(headerJson);

            string payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload));
            JObject payloadData = JObject.Parse(payloadJson);

            if (verify)
            {
                var keyBytes = Convert.FromBase64String(key); // your key here


                AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes);
                RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
                RSAParameters rsaParameters = new RSAParameters();
                rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
                rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.ImportParameters(rsaParameters);

                SHA256 sha256 = SHA256.Create();
                byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(parts[0] + '.' + parts[1]));

                RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
                rsaDeformatter.SetHashAlgorithm("SHA256");
                if (!rsaDeformatter.VerifySignature(hash, Convert.FromBase64String(parts[2])))
                    throw new ApplicationException(string.Format("Invalid signature"));
            }

            return payloadData.ToString();
        }

Однако строка AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey (keyBytes); выдает исключение с сообщением «Неверный размер последовательности: 3 Имя параметра: seq ".

Кто-нибудь знает, почему это происходит, или любой другой правильный способ подписать JWT?

Спасибо!

...