c# - 忽略 JWT 中的签名

标签 c# .net x509certificate jwt

我有一个使用 OpenId Connect 的 Web 应用程序。我创建了一个自签名证书,但它仍未由 CA 签名。 如何忽略签名验证?

这是我目前所拥有的:

SecurityToken validatedToken = null;

var tokenHandler = new JwtSecurityTokenHandler {
    Configuration = new SecurityTokenHandlerConfiguration {
        CertificateValidator = X509CertificateValidator.None
    },
};

TokenValidationParameters validationParams =
    new TokenValidationParameters()
    {
        ValidAudience = ConfigurationManager.AppSettings["Audience"],
        ValidIssuer = ConfigurationManager.AppSettings["Issuer"],
        AudienceValidator = AudienceValidator,
        ValidateAudience = true,
        ValidateIssuer = true
    };

return tokenHandler.ValidateToken(jwtToken, validationParams, out validatedToken);

它抛出以下异常:

IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier\r\n (\r\n
IsReadOnly = False,\r\n Count = 1,\r\n Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause\r\n
)\r\n', \ntoken: '{\"typ\":\"JWT\",\"alg\":\"RS256\",\"kid\":\"issuer_rsaKey\"}.{\"iss\":...

最佳答案

不要忽略签名,这很危险!

即使您使用自签名证书,您也可以使用公钥进行签名验证。

由于您使用的是 OpenId Connect,您应该能够通过前往 /.well-known/jwks 获取签名证书的公钥

然后你可以像这样设置你的验证参数:

var certificate = new X509Certificate2(Convert.FromBase64String(yourPublicKeyGoesHere));

var validationParameters = new TokenValidationParameters { 
    IssuerSigningTokens = new[] { new X509SecurityToken(certificate) }  
};

之后,您可以调用ValidateToken:

SecurityToken token;
var claimsPrincipal = handler.ValidateToken(encodedToken, validationParameters, out token);

您真的要忽略签名吗?

请记住,如果这样做,您怎么知道有人没有篡改 token 中的数据?您可以轻松解码 base64 url​​ 编码的有效负载并更改主题。如果您在应用程序中依赖它,就会遇到麻烦(提示:有人访问其他人的数据)

您真的、真的想忽略它吗?

您可以使用 ReadToken 并跳过所有验证:

var badJwt = new JwtSecurityTokenHandler()
                 .ReadToken(encodedMaliciousToken) as JwtSecurityToken;

不要这样做,这是不好的做法。

关于c# - 忽略 JWT 中的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26892788/

相关文章:

iis-6 - 证书 : Cannot find the certificate and private key for decryption Error when sign

c# - 单击按钮时如何在文本框中显示不同的sql数据

c# - 无法将类型 'int' 隐式转换为 'Foo.Bar.Delegates.Program.ParseIntDelegate'

c# - 如何从值类型 T 的 List<List<T>> 中删除重复项?

c# - 将 List<string> 转换为 StringCollection

powershell - OIDC token 签名和 token 验证的适当X.509设置

c# - 在运行时动态创建按钮并存储,在 C# 中永久检索它

c# - 为什么 VS 11 中的按钮点击速度很慢,如何解决?

c# - 使用 System.Net.Http 避免 TRUSTWORTHY ON 和 PERMISSION_SET = UNSAFE

c++ - 如何读取 USB token 上存储的 X.509 证书的详细信息?