c# - 使用 RS256 PII 的 JWT SecurityTokenInvalidSignatureException 被隐藏

标签 c# jwt

求助!我在使用 Microsoft 的 System.IdentityModel.Tokens.Jwt 库验证使用 RS256 签名的 JWT token 时遇到问题。

此 token 在 JWT.io 上验证得很好.

这是错误:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException IDX10503: Signature validation failed. Keys tried: '[PII is hidden]'. Exceptions caught: '[PII is hidden]'. token: '[PII is hidden]'.

这是示例代码(我使用了 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 is hidden] 就好了,这样我就可以看到有关错误的更多详细信息。在 app.config 甚至 machine.config 文件中将 enableLoggingKnownPii 和 logKnownPII 设置为 true 似乎没有什么不同。

最佳答案

事实证明,X509SecurityKey 的 KeySize 长度至少需要 1024 才能进行验证。这在异常中并不明显,因为它被 [PII is hidden] 过滤器隐藏了。

添加以下行使异常文本更有用(添加到 Startup.cs 中的 ConfigureServices 方法):

IdentityModelEventSource.ShowPII = true;

新的异常文本:

'System.ArgumentOutOfRangeException: IDX10631: The 'Microsoft.IdentityModel.Tokens.X509SecurityKey' for verifying cannot be smaller than '1024' bits. KeySize: '512'.

将非对称 key 的长度增加到 1024 解决了这个问题。

关于c# - 使用 RS256 PII 的 JWT SecurityTokenInvalidSignatureException 被隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50590432/

相关文章:

javascript - 如何在 Node js中的jwt token 到期时自动执行休息调用

spring-boot - 如何在 Spring 中使用 OAuth2 和 JWT token 代表特定用户调用 protected 资源?

c# - 区分具有相同属性的两个对象

security - 将 jwt token 作为 url 的一部分传递是否不好?

c# - 为什么要在窗体上放置标准对话框?

c# - 如何相对于按钮在 Windows 应用商店应用程序中定位弹出控件?

spring-boot - Springboot安全+jwt 'springSecurityFilterChain'错误

java - 如何在 Spring Boot 单元测试中模拟 JWT 身份验证?

c# - 使用 Youtube API 添加评论在 .NET 中随机失败

c# - 有没有办法使属性成为 Required 但仅适用于前端而不适用于数据库?