我有一个使用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 \":...
答案 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;
}