Нужно ли System.IdentityModel.Tokens.Jwt работать с JWT при использовании библиотеки IdentityModel IdentityServer? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть простой клиент командной строки для существующего веб-сервиса, который использует IdentityServer4. Клиент получает обратно JWT от IdentityServer4, который содержит утверждения пользователя, которые используются клиентом.

Я заметил, что библиотека IdentityModel.dll IdentityServer не содержит никаких функций для разбора токенов JWT для извлечения заявок. Я видел несколько примеров ( как этот ) использования JwtSecurityTokenHandler, который определен в System.IdentityModel.Tokens.Jwt - который сам по себе имеет зависимости от Microsoft.IdentityModel.JsonWebTokens, Microsoft.IdentityModel.Logging, Microsoft.IdentityModel.Tokens и Newtonsoft.Json.

Это много зависимостей для простого извлечения закодированного текста из JWT.

Я не прошу рекомендации по библиотеке, я просто подтверждаю, что рекомендуется использовать System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler для извлечения претензий из JWT при использовании IdentityModel.dll.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Если вы хотите сделать это правильно (т.е. с проверкой подписи и т. Д.), Тогда да, это обычный способ в .Net-land.

Если вы хотите извлечь информацию из токена, но не хотите доверять ей, тогда вам просто нужно иметь возможность декодировать строки base64url и анализировать JSON, но я бы не рекомендовал это.

0 голосов
/ 28 августа 2018

IdentityModel.OidcClient.IdentityTokenValidator внутренне использует JwtSecurityTokenHandler при проверке токена, так что да, это нормальный способ.
В качестве альтернативы вы можете, да, использовать вспомогательный метод Base64Url.Decode(b64url) из Identity, а затем Newtonsoft.Json для анализа необработанный токен.

Тем не менее, существует гораздо более удобный подход для перечисления пользовательских заявлений при использовании полного OidcClient, такого как тот из IdentityModel :

var result = await oidcClient.LoginAsync();
cfg.accessToken = result.AccessToken;
cfg.identityToken = result.IdentityToken;
cfg.refreshToken = result.RefreshToken;

if (result.IsError)
{
    Console.WriteLine("\n\nError:\n{0}", result.Error);
    return;
}

Console.WriteLine("\n\nClaims:");
foreach (var claim in result.User.Claims)
{
     Console.WriteLine("{0}: {1}", claim.Type, claim.Value);
}    

(см. Полный пример здесь )

...