【发布时间】:2018-04-27 22:38:24
【问题描述】:
我正在尝试使用Microsoft.IdentityModel.Tokens 库来验证 .NET Core 和 .NET 4.6.1 中 JSON Web 令牌的有效性。我深入研究了源代码,发现AsymmetricSignatureProvider在.NET Core和其他版本的bool Verify(byte[] input, byte[] signature)方法中处理签名验证的方式不同,这也是我验证失败的地方。你可以在这个link找到源代码。
一般来说,我首先下载 JSON Web 密钥集,然后构建安全密钥,最后构建 TokenValidationParameters 并验证令牌。
我的代码从这里开始
下载 JSON Web 密钥集:
string data = null;
using (WebClient client = new WebClient())
{
data = client.DownloadString(URL_TO_JWKS);
}
var jwks = new JsonWebKeySet(data);
在这里,我正在从 JSON Web 密钥集构建安全密钥。请注意我如何解码指数和模数,在 .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 有效性的正确方法是什么?
【问题讨论】: