使用RS256 PII的JWT SecurityTokenInvalidSignatureException被隐藏

时间:2018-05-29 18:08:59

标签: c# jwt

请帮忙!我在使用Microsoft的System.IdentityModel.Tokens.Jwt库验证使用RS256签名的JWT令牌时遇到问题。

此令牌在JWT.io上正常验证。

这是错误:

  

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException       IDX10503:签名验证失败。密钥尝试:' [PII隐藏]'。       遇到例外情况:        ' [PII被隐藏]'。       令牌:' [PII隐藏]'。

这是示例代码(我使用LinqPad,使用System.IdentityModel.Tokens.Jwt v5.2.2 NuGet包)

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隐藏],以便我可以看到有关错误的更多细节。在app.config或甚至machine.config文件中将enableLoggingKnownPii和logKnownPII设置为true似乎没有什么区别。

2 个答案:

答案 0 :(得分:11)

事实证明,X509SecurityKey的KeySize至少需要1024个才能进行验证。这种情况并不明显,因为隐藏了[PII隐藏]过滤器。

添加以下行使得异常文本更有用:

IdentityModelEventSource.ShowPII = true;

新的例外文字:

  

'System.ArgumentOutOfRangeException:IDX10631:用于验证的'Microsoft.IdentityModel.Tokens.X509SecurityKey'不能小于'1024'位。 KeySize:'512'。

将不对称密钥的长度增加到1024解决了这个问题。

答案 1 :(得分:7)

您可以按如下所示在appsettings.json文件中增加密钥长度。

"Jwt": {
    "Key": "pintusharmaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqweqwe",
    "Issuer": "pintusharma.com"
  }