忽略JWT中的签名
我有一个使用OpenId Connect的Web应用程序。 我创建了一个自签名证书,但它仍未由CA签名。 如何忽略签名validation?
这是我到目前为止:
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);
它抛出以下exception:
IDX10500:签名validation失败。 无法解析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 \”:…
不要忽视签名, 这很危险!
即使您使用自签名证书,也可以使用公钥进行签名validation。
由于您使用的是OpenId Connect,因此您应该能够通过转到/.well-known/jwks
获取签名证书的/.well-known/jwks
。
然后您可以设置validation参数,如下所示:
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
,只需跳过每个validation:
var badJwt = new JwtSecurityTokenHandler() .ReadToken(encodedMaliciousToken) as JwtSecurityToken;
不要这样做,这是不好的做法。