助けてください! MicrosoftのSystem.IdentityModel.Tokens.Jwtライブラリを使用してRS256で署名されたJWTトークンの検証に問題があります。
このトークンは、 JWT.io で正常に検証されます。
これはエラーです:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException IDX10503:署名の検証に失敗しました。試したキー:「[PII is hidden]」。キャッチされた例外: '[PII is hidden]'。トークン:「[PII is hidden]」。
これはサンプルコードです(System.IdentityModel.Tokens.Jwt v5.2.2 NuGetパッケージでLinqPadを使用しました):
void Main()
{
var cText =
"-----BEGIN CERTIFICATE-----\n" +
"MIIBljCCAUACCQCIDMpqK7WfWDANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJV\n" +
"UzETMBEGA1UECAwKU29tZS1TdGF0ZTESMBAGA1UECgwJTHV4b3R0aWNhMRowGAYD\n" +
"VQQLDBFMdXhvdHRpY2EgZXllY2FyZTAeFw0xODA1MjMxNTE1MjdaFw0yODA1MjAx\n" +
"NTE1MjdaMFIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYD\n" +
"VQQKDAlMdXhvdHRpY2ExGjAYBgNVBAsMEUx1eG90dGljYSBleWVjYXJlMFwwDQYJ\n" +
"KoZIhvcNAQEBBQADSwAwSAJBAKuMYcirPj81WBtMituJJenF0CG/HYLcAUOtWKl1\n" +
"HchC0dM8VRRBI/HV+nZcweXzpjhX8ySa9s7kJneP0cuJiU8CAwEAATANBgkqhkiG\n" +
"9w0BAQsFAANBAKEM8wQwlqKgkfqnNFcbsZM0RUxS+eWR9LvycGuMN7aL9M6GOmfp\n" +
"QmF4MH4uvkaiZenqCkhDkyi4Cy81tz453tQ=\n" +
"-----END CERTIFICATE-----";
var c = new X509Certificate2(Encoding.ASCII.GetBytes(cText));
var p = new TokenValidationParameters();
p.IssuerSigningKeyResolver = (s, securityToken, identifier, parameters)
=> new[] { new X509SecurityKey(c) };
var h = new JwtSecurityTokenHandler();
var token = @"eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJuLmNoaWVmZm8iLCJleHAiOjE1MjcyMzg4ODEsImlzcyI6Imx1eCJ9.BAaYzLwokmdKqLi6zKjGIpDXd__dZxi5PUWWHS3PSLPDYAInzPbEK8o4WxunoGD7eA0qtQNaxNpzeOc3BHrd4w";
h.ValidateToken(token, p, out SecurityToken _);
}
最後に、[PII is hidden]を削除する方法も知っておくといいでしょう。エラーの詳細を確認できます。 app.configまたはmachine.configファイルでenableLoggingKnownPiiとlogKnownPIIをtrueに設定しても違いはないようです。
X509SecurityKeyのKeySizeは、検証のために少なくとも1024の長さが必要であることがわかります。 [PII is hidden]フィルターで非表示になるため、これは例外から明らかではありません。
次の行を追加すると、例外テキストがさらに便利になりました。
IdentityModelEventSource.ShowPII = true;
新しい例外テキスト:
'System.ArgumentOutOfRangeException:IDX10631:検証用の' Microsoft.IdentityModel.Tokens.X509SecurityKey 'を' 1024 'ビットより小さくすることはできません。 KeySize: '512'。
非対称キーの長さを1024に増やすと、問題が解決しました。