使用IdentityServer的IdentityModel库时,是否需要System.IdentityModel.Tokens.Jwt与JWT一起使用?

时间:2018-08-28 03:45:32

标签: jwt identityserver4

对于使用IdentityServer4的现有Web服务,我有一个简单的命令行客户端。客户端从IdentityServer4接收回JWT,其中包含客户端使用的用户声明。

我注意到IdentityServer的IdentityModel.dll库不包含任何用于解析JWT令牌以提取声明的功能。我看到一些示例(like this one)使用JwtSecurityTokenHandler中定义的System.IdentityModel.Tokens.Jwt-它本身依赖于Microsoft.IdentityModel.JsonWebTokensMicrosoft.IdentityModel.LoggingMicrosoft.IdentityModel.Tokens,和Newtonsoft.Json

从JWT中提取编码文本有很多依赖性。

我不是要图书馆的建议,只是要确认使用System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler时使用IdentityModel.dll从JWT中提取声明是最佳实践。

2 个答案:

答案 0 :(得分:0)

IdentityModel.OidcClient.IdentityTokenValidator在验证令牌时在内部使用JwtSecurityTokenHandler,所以是的,这是正常的方法。
或者,您可以使用Identity的帮助方法Base64Url.Decode(b64url),然后使用Newtonsoft.Json解析原始令牌。

但是,当使用完整的OidcClient(例如the one from 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);
}    

(请参阅完整的示例here

答案 1 :(得分:0)

如果您想正确执行此操作(即使用签名验证等),那么可以,这是.Net-land中的常用方法。

如果您想从令牌中提取信息但不关心信任它,那么您只需要能够解码base64url字符串并解析JSON,但我不建议这样做。