我试图通过使用Microsoft.IdentityModel.Tokens
库来改变.NET Core和.NET 4.6.1中JSON Web Token的有效性。我挖掘了源代码并注意到AsymmetricSignatureProvider
以不同方式处理.NET Core和其他版本的方法bool Verify(byte[] input, byte[] signature)
中的签名验证,这也是我的验证失败的地方。您可以在此link中找到源代码。
一般情况下,我首先下载JSON Web Key Sets,然后我正在构建安全密钥,最后我正在构建TokenValidationParameters
并验证令牌。
我的代码从这里开始
下载JSON Web密钥集:
string data = null;
using (WebClient client = new WebClient())
{
data = client.DownloadString(URL_TO_JWKS);
}
var jwks = new JsonWebKeySet(data);
这里我从JSON Web Key Sets构建安全密钥。请注意我如何解码指数和模数,可能是.NET 4.1.6中的错误:
var keys = new List<SecurityKey>();
foreach (var webKey in jwks.Keys)
{
var e = Base64UrlEncoder.DecodeBytes(webKey.E);
var n = Base64UrlEncoder.DecodeBytes(webKey.N);
var key = new RsaSecurityKey(new RSAParameters { Exponent = e, Modulus = n })
{
KeyId = webKey.Kid
};
keys.Add(key);
}
我在这里验证令牌:
var token = new JwtSecurityToken(tokenString);
ClaimsPrincipal claimsPrincipal = null;
var parameters = new TokenValidationParameters()
{
ValidAudiences = token.Audiences,
IssuerSigningKeys = keys,
NameClaimType = nameClaimType ?? JwtRegisteredClaimNames.Sub,
ValidIssuers = new[] { token.Issuer }
};
bool isValid = false;
try
{
string jwt = token.RawData;
SecurityToken securityToken = null;
claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(jwt, parameters, out securityToken);
isValid = claimsPrincipal.Identity.IsAuthenticated;
}
catch (SecurityTokenExpiredException)
{
}
catch (SecurityTokenInvalidSignatureException ex)
{
}
验证.NET 4.6.1和.NET Core的有效性的正确方法是什么?
答案 0 :(得分:1)
发生此行为是因为.net 4.6.1不会删除前导0x00。 Pull请求已经合并,它将在5.2.0版本中提供。
有关详细信息,请访问github上的issues。