C# 从JWT获取编码数据

C# 从JWT获取编码数据,c#,.net,jwt,C#,.net,Jwt,我有一个程序,可以从API获取数据,并使用JWT进行通信/授权。在客户端,我需要获取一些在JWT中编码为声明的数据,而不是再次ping API,我认为最好只从令牌获取信息,因此我编写了以下快速方法: string GetTokenValue(string tokenType) { if (string.IsNullOrWhiteSpace(CurrentAuth?.AccessToken)) return null; var jwt = new JwtSecurityToken

我有一个程序,可以从API获取数据,并使用JWT进行通信/授权。在客户端,我需要获取一些在JWT中编码为声明的数据,而不是再次ping API,我认为最好只从令牌获取信息,因此我编写了以下快速方法:

string GetTokenValue(string tokenType)
{
    if (string.IsNullOrWhiteSpace(CurrentAuth?.AccessToken)) return null;

    var jwt = new JwtSecurityToken(CurrentAuth.AccessToken);
    return jwt.Claims.FirstOrDefault(x => x.Type == tokenType)?.Value;
}
总体而言,这似乎工作得很好,但是我有一些客户机在解码时出现了一些错误。以下是从一个服务器发送的堆栈的相关部分:

IDX12729: Unable to decode the header '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]' as Base64Url encoded string. jwtEncodedString: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.

   at System.IdentityModel.Tokens.Jwt.JwtSecurityToken.Decode(String[] tokenParts, String rawData)

这不是推荐的方法吗?为什么它在大多数机器上都能正常解码,但在少数机器上会失败?

jwt.io
上验证令牌。如果它是无效的,那么问题不在于你的代码(或者至少不是这个代码)嗯。我会尝试,但这是问题的一部分,它不会在我的机器上做,只是在少数用户机器上,所以我没有他们的令牌要测试。由于它是PII,.NET framework会将它从错误堆栈中删除,所以我现在确实没有访问它的权限。我想我可以输入一些东西来记录令牌,但这需要一个新的构建,并且在出现错误后,他们会向我发送日志,这需要一些时间。。。将启动该过程,但希望有一个更快的方法。它是否在每台机器的基础上持续失败?也就是说,当机器D总是出现故障时,机器A-C是否始终正常工作?这可能表明D中缺少一个密码套件。我仍在试图确定这一点,但到目前为止,它似乎是随机的。在这种情况下,我认为你现在唯一的选择是收集更多的诊断信息以确定行为模式。您在尝试修复时实施的修复将基于此时的猜测,并且可能会造成伤害(只要任何更改引入了风险因素)。您的代码可能根本没有问题,例如,其他一些系统可能不适当地修改了令牌。