忽略JWT中的签名
本文关键字:JWT 忽略 | 更新日期: 2023-09-27 18:30:06
我有一个使用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:签名验证失败。无法解析SecurityKeyIdentifier:'SecurityKeyIdentifier''r''n(''r''n
IsReadOnly=False,''r''n计数=1,''r''n子句[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);
您真的想忽略签名吗
记住,如果你这样做了,你怎么知道有人没有篡改令牌中的数据?您可以很容易地解码base64 url编码的负载并更改主题。如果你在应用程序中依赖它,你就会遇到麻烦(提示:有人访问别人的数据)
你真的,真的想忽略它吗
您可以使用ReadToken
,跳过所有验证:
var badJwt = new JwtSecurityTokenHandler()
.ReadToken(encodedMaliciousToken) as JwtSecurityToken;
不过不要那样做,这是不好的做法
public TokenValidationParameters CreateTokenValidationParameters()
{
var result = new TokenValidationParameters
{
ValidateIssuer = false,
ValidIssuer = ValidIssuer,
ValidateAudience = false,
ValidAudience = ValidAudience,
ValidateIssuerSigningKey = false,
//IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey)),
//comment this and add this line to fool the validation logic
SignatureValidator = delegate(string token, TokenValidationParameters parameters)
{
var jwt = new JwtSecurityToken(token);
return jwt;
},
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
result.RequireSignedTokens = false;
enter code here
return result;
}