忽略JWT中的签名

Bon*_*omi 2 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

它抛出以下异常:

IDX10500:签名验证失败.无法解析SecurityKeyIdentifier:'SecurityKeyIdentifier\r \n(\ r \n
IsReadOnly = False,\ r \nCount = 1,\ r \n Clause [0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause\r \n
)\ r \n',\ntoken:'{\"typ \":\"JWT \",\"alg \":\"RS256 \",\"kid \":\"issuer_rsaKey \"}.{\" ISS \":...

Fil*_*erg 12

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

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

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

然后,您可以设置验证参数,如下所示:

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

var validationParameters = new TokenValidationParameters { 
    IssuerSigningTokens = new[] { new X509SecurityToken(certificate) }  
};
Run Code Online (Sandbox Code Playgroud)

之后,您可以致电ValidateToken:

SecurityToken token;
var claimsPrincipal = handler.ValidateToken(encodedToken, validationParameters, out token);
Run Code Online (Sandbox Code Playgroud)

你真的想忽略签名吗?

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

你真的,真的想忽略它吗?

您可以使用ReadToken并跳过每个验证:

var badJwt = new JwtSecurityTokenHandler()
                 .ReadToken(encodedMaliciousToken) as JwtSecurityToken;
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么将`TokenValidationParameter.ValidateIssuerSigningKey`设置为false并不能绕过签名验证呢? (3认同)