Проверка JWT работает в .NET Core, не проходит в .NET Framework - PullRequest
1 голос
/ 15 апреля 2019

Подобно проблеме, упомянутой здесь , у меня есть проблема, когда проверка JWT работает при работе в .NET Core 2.2 (в macOS и в Windows), но не запускается в .NET Framework 4.7.2;там выдается исключение:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException : 'IDX10503: Ошибка проверки подписи.Ключи пробовали: «Microsoft.IdentityModel.Tokens.RsaSecurityKey, KeyId:».Выявлены исключения: ''.token: '{"typ": "JWT", "alg": "RS256"}. {"sub": "имя пользователя", "scope": "examplescope", "role": ["examplerole"], "iss":" https://example.com/","exp":1556788122,"iat":1555316893}'.'
в System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (параметры проверки правильности строкового токена, TokenValidationParameters) в C: \ agent1_work \ 109 \ s \ src \ System.IdentityMok.cs: строка 979
в System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (Строковый токен, TokenValidationParameters validationParameters, SecurityToken & validatedToken) в C: \ agent1_work \ 109 \ s \ ток.документах.cs: ​​строка 722
в JWTTest.Program.Main (String [] args) в C: \ Users \ Пользователь \ source \ repos \ JWTTest \ JWTTestCore \ Program.cs: строка 35

Тестовая программа:

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Security.Cryptography;
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;

namespace JWTTest {
    class Program {
        static void Main(string[] args) {
            // Validation parameters
            //var rsa = new RSACryptoServiceProvider(); // this works in .NET Core on macOS but not on Windows ...
            var rsa = RSA.Create();
            rsa.KeySize = 2048;
            rsa.ImportParameters(new RSAParameters {
                  Modulus = Convert.FromBase64String("AM/Nh9cX8U+8ZeOcKyodBcZun1dgQysFZWLplOof9SpHt45vmh7gy3FxhLQEj2NrhV44AiymRxr1mmZ7K9K105MfDe/QAAFBy715/NHmKZxH7QvypiiPMf2jwpb+n/Ss0oUZ68zPSfO9aZwhUBWO+J7NBnWEwoq3Bxda5IQPMRkMohD5VZ0IPvUotcg6k7cOoRamvOiDyVQ58uVx+Wd+vucdVo6uT/kMKlBZoahU/hnREfNZojf0lAkzcxOlZcKbms/+Mu8vb/jeZSGYZpykL0c3ohGJ49NteFIXggx8AH6E8ROpijq2NeA7AK3Y+33LEJmSwOdNnZ1ZaY515AqeN/S+ay4Ra15V91qdu4ph1B+G5aKV3rcu0v1Y6/eG5dgHPIBRaf7sGVG7rCDOgrfbjaEdNvqX1TgNnmfogZElFt2qs5VVWKE5zEuOEkOngTEuvlJAsTgh/Uw/OS7vinbSmtGXFhKS2teatITyuNALaPeFAdA9qz9c90IJs9vbf9Uf9FFWvfrer9lhDhLUuehKJTt8vBtoqea46nf3IGthLeiGQmrVSEytoTGW67gGpVo8Xd+iat5ilhciNWX1/rscv66cg0S1IK7A/oXqWJO/WNq6EzFxI/f/0klMrcC8M5qioiiwNMvpAj/6KDZSxoII+rS9RDz/E0xWprkErrIa7aVv"),
                  Exponent = Convert.FromBase64String("AQAB")
            });
            var validationParameters = new TokenValidationParameters {
                ClockSkew = TimeSpan.FromMinutes(1),
                ValidateAudience = false,
                ValidateIssuer = true,
                ValidIssuer = "https://example.com/",
                IssuerSigningKey = new RsaSecurityKey(rsa)
            };

            // Verify token
            IdentityModelEventSource.ShowPII = true;
            JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
            var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c2VybmFtZSIsInNjb3BlIjoiZXhhbXBsZXNjb3BlIiwicm9sZXMiOlsiZXhhbXBsZXJvbGUiXSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS8iLCJleHAiOjE1NTY3ODgxMjIsImlhdCI6MTU1NTMxNjg5M30.XHowlwvKX73I2KqKFInaadAGZNtj7UVvjh1EuodnttlUOmC59Q6XPSwrKkATLqicl46c7ItYGl75Mj5PVy03tOXXlxgsgoP81t1WM08QeHlrbPvay1aSFqcj7JcnX6fu9qiXzRhhh2XYw5UrT8-R3kIQMQA7d4cnT6Z1oeoHzV38ywi3rv3BapwuFtrFmSXHHsQMcTUK_Whf-5CEPj6O9CEdCXKFh05McGZDBoYBgZpn7d2H2EJNV9KhsasafsD7TVs6w3myOfc3HaqtHhFDUmpzwmWZdzn-i0zSxz1qussd9ovDaf03zkd7OWtau9_44T1KkWVK8GlAxuXnuPmCuh76ELQjpNqQerRL-F4EYkUwUJEQHFf2IolpCx4i2pDkzyax-fL4ZwjsncWNUJdXyex3Pk-OcSD11lJl0UWRE5gh-pOeEd1Ybhxu4z42Vet1rAM3VWXXyJQzAz2diVTJIbvaG3uq4-HxoBTkvfpXLj_2RN_oSTkyD8JoBIHQtMT1h7eZhHbxFLsxLoGNQVWJmyU_BPCs282m41n2Jd4ezR1M1XlLUixk8v1M1Rjxg3s7c8Q_PezmXzv3IrK8ftrmfb73uBwTxJukOeFk3yC7e7ZLhYJsBlJsyeGfJF8ayNSjxwkrXJN3JVZMOzZCQNnl3zc8AL6gjloFFlhgB5nlxJU";
            // exception is thrown on the next line:
            var user = handler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);

            foreach (var role in user.Claims.Where(c => c.Type == ClaimTypes.Role)) {
                Console.WriteLine("Role: " + role.Value);
            }
        }
    }
}

JWT генерируется с этой библиотекой Java , но я не уверен, имеет ли это значение, согласно jwt.io этодействительный. (Ссылка говорит неверную подпись, но это ошибка на веб-сайте; просто добавьтеновая строка в конце открытого ключа для запуска проверки.) Я пробовал токены, сгенерированные алгоритмами RS256 и RS512, но это не имеет значения.

Я не уверен, зависит ли это отнастройка Visual Studio;

  • macOS Mojave 10.14.4;Visual Studio для Mac 7.7.3 (сборка 43);.NET Core SDK версии 2.2.105 (работает)
  • Windows 10, версия 1809;Visual Studio 2017, v15.9.11
    • .NET Core SDK 2.2.106 (работает)
    • .NET Framework 4.7.2 (не работает)

1 Ответ

1 голос
/ 15 апреля 2019

Нет, библиотека Java не должна быть проблемой. Эта проблема упоминается в той же ссылке, что и вы. Вам необходимо переопределить и использовать пользовательскую проверку ключа, поскольку в библиотеке есть какая-то ошибка, связанная с расшифровками RSA.

Посмотрите на это и это для получения дополнительной информации [снова это та же ссылка, с которой вы прикрепили].

Проблема была включена в другую проблему и была закрыта. Возможно, это следует исправить, если только некоторые пакеты не обновлены или в упомянутой там версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...