Невозможно прочитать токен JWT, созданный с использованием System.IdentityModel.Tokens.Jwt - PullRequest
0 голосов
/ 22 мая 2019

Мы начали разработку нового проекта и рассматриваем возможность использования Identity Server / OpenId для авторизации и аутентификации. Поскольку я не работал с токенами Jwt до того, как начал изучать классы Jwt от Microsoft и поддержку, а также пробовал некоторый пример кода. Я установил System.Identitymodel.Tokend.Jwt версии 5.4 из Nuget и сгенерировал токен, используя приведенный ниже пример кода (который я обнаружил при переполнении стека)

        string strToken = string.Empty;

        string strKey = "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429090fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1";
        var vSymmetricSecurityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(strKey));
        var vSigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(vSymmetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);
        var header = new JwtHeader(vSigningCredentials);
        var payload = new JwtPayload
        {
            { "Id", "userId" },
            { "Role", "userrole" },
            { "FirstName", "first_name" },
            { "LastName", "last_name" },
            { "EmailAddress", "email_address" },
            { "TenantId", "tenant_id" },
        };
        var secToken = new JwtSecurityToken(header, payload);
        var handler = new JwtSecurityTokenHandler();
        strToken = handler.WriteToken(secToken);

Токен успешно создан. Но когда я иду, чтобы прочитать токен, я получаю следующую ошибку

IDX12709: CanReadToken () вернул false. JWT не очень хорошо сформирован: «[PII скрыт]». Маркер должен быть в формате JWS или JWE Compact Serialization. (JWS): 'EncodedHeader.EndcodedPayload.EncodedSignature'. (JWE): 'EncodedProtectedHeader.EncodedEncryptedKey.EncodedInitializationVector.EncodedCiphertext.EncodedAuthenticationTag'.

Если я вставляю токен в JWT - он говорит мне неверную подпись. Что может быть неверным?

Сгенерированный токен eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6InVzZXJJZCIsIlJvbGUiOiJ1c2Vycm9sZSIsIkZpcnN0TmFtZSI6ImZpcnN0X25hbWUiLCJMYXN0TmFtZSI6Imxhc3RfbmFtZSIsIkVtYWlsQWRkcmVzcyI6ImVtYWlsX2FkZHJlc3MiLCJUZW5hbnRJZCI6InRlbmFudF9pZCJ9.BXUFKLcVmnGxRG5yGRNYVLTU2gT_F_AmBGev6sWhQd0

1 Ответ

0 голосов
/ 22 мая 2019

Вы используете неправильный тип ключа и алгоритм.JWT использует открытые / закрытые ключи, а не симметричные ключи.

Кроме того, существует стандарт для содержания претензий JWT (полезная нагрузка).Вам не хватает таких элементов, как выпущенные поля, поля с истекшим сроком действия и т. Д.Как только вы решите проблему с подписью, создайте новый вопрос, если вам нужна помощь с заявками JWT, поскольку это совсем другая тема.

Примечание: strKey должен быть закрытым ключом пары ключей.Открытый ключ используется для проверки подписи JWT (называемой JWS).

Измените эти строки:

var vSymmetricSecurityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(strKey));
var vSigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(vSymmetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);

на:

var vRsaSecurityKey = new Microsoft.IdentityModel.Tokens.RsaSecurityKey(privateKey);
var vSigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(vSymmetricSecurityKey, SecurityAlgorithms.RsaSha256Signature);
...