忽略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''":…

忽略JWT中的签名

不要忽略签名,这很危险

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

由于您使用的是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;
}