忽略JWT中的签名

时间:2014-11-12 17:21:54

标签: c# .net 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);

抛出以下异常:

  

IDX10500:签名验证失败。无法解决   SecurityKeyIdentifier:' SecurityKeyIdentifier \ r \ n(\ r \ n \ n   IsReadOnly = False,\ r \ n计数= 1,\ r \ n子句[0] =   System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause \ r \ n
  )\ r \ n',\ ntoken:   ' {\"典型值\":\" JWT \" \" ALG \":\" RS256 \&# 34; \"小子\":\" issuer_rsaKey \"} {\" ISS \":...

2 个答案:

答案 0 :(得分:12)

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

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

由于您使用的是OpenId Connect,因此您应该可以通过转到Weather testMe = new Weather(100.6f, 31, 7, 1997); if(testMe.toString().equals("July 31, 1997. Temperature is 100.60 C.")) { score+=1} if(testMe.getTemp() == 100.6f) {score+=1} if(testMe.isCelcius()) {score+=1;} testMe.setFahrenheit(); if(testMe.toString().equals("July 31, 1997. Temperature is 213.08 F.")) { score+=1} if(testMe.getTemp() == 213.08f) {score+=1} if(!testMe.isCelcius()) {score+=1;} testMe.setCelcius(); if(testMe.isCelcius()) {score+=1;} 来获取签名证书的公钥

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

/.well-known/jwks

之后,您可以致电var certificate = new X509Certificate2(Convert.FromBase64String(yourPublicKeyGoesHere)); var validationParameters = new TokenValidationParameters { IssuerSigningTokens = new[] { new X509SecurityToken(certificate) } };

ValidateToken

你真的想忽略签名吗?

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

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

您可以使用SecurityToken token; var claimsPrincipal = handler.ValidateToken(encodedToken, validationParameters, out token); ,只需跳过所有验证:

ReadToken

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

答案 1 :(得分:0)

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;
}