对于使用IdentityServer4的现有Web服务,我有一个简单的命令行客户端。客户端从IdentityServer4接收回JWT,其中包含客户端使用的用户声明。
我注意到IdentityServer的IdentityModel.dll
库不包含任何用于解析JWT令牌以提取声明的功能。我看到一些示例(like this one)使用JwtSecurityTokenHandler
中定义的System.IdentityModel.Tokens.Jwt
-它本身依赖于Microsoft.IdentityModel.JsonWebTokens
,Microsoft.IdentityModel.Logging
,Microsoft.IdentityModel.Tokens
,和Newtonsoft.Json
。
从JWT中提取编码文本有很多依赖性。
我不是要图书馆的建议,只是要确认使用System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler
时使用IdentityModel.dll
从JWT中提取声明是最佳实践。
答案 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,但我不建议这样做。