忽略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; 

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