Microsoft.IdentityModel.Tokens
ライブラリを使用して、.NET Coreと.NET 4.6.1の両方でJSON Webトークンのバリデーションを試みています。私はソースコードを掘り出して、AsymmetricSignatureProvider
が.NETコアのメソッドbool Verify(byte[] input, byte[] signature)
と他のバージョンの署名検証を異なる方法で処理することに気付きました。これは私の検証が失敗した場所です。このlinkにソースコードがあります。.NET CoreでJSON Webトークンの妥当性検証が成功しましたが、.NET 4.6.1で失敗しました
一般に私は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);
}
ここで私は、トークンを検証しています:両方の.NET用の妥当性を検証するための正しい方法である
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)
{
}
何4.6.1と.NETコア?