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)
不要这样做,这是不好的做法.