我有一个使用 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/