我有一个位于API网关后面的API。 API网关在将请求传递给API之前验证承载令牌。
我的API使用asp.net核心2.0本机身份验证和基于声明的授权框架。从JWT令牌获取声明的繁琐工作由Microsoft.AspNetCore.Authentication.JwtBearer
中的中间件完成。
可以将此中间件配置为忽略令牌上的过期日期,并且还可以指定本地公钥,因此无需联系令牌权限以获取令牌,但是是否可以仅禁用令牌上的签名验证?
这将允许在开发中使用无符号令牌进行临时测试,并防止在生产中进行双重验证(网关和API)。
答案 0 :(得分:5)
尝试一下。终于,经过这么多的尝试,我才开始使用它。
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;
return result;
}
答案 1 :(得分:2)
您可以使用JwtBearerOptions.TokenValidationParameters
设置令牌验证。您可以从the class definition检查所有可用参数。
包含
Microsoft.IdentityModel.Tokens.SecurityTokenHandler
验证Microsoft.IdentityModel.Tokens.SecurityToken
时使用的一组参数。
如果您想完全禁用验证,请将所有ValidateXXX
和RequireXXX
布尔属性设置为false:
.AddJwtBearer("<authenticationScheme>", configureOptions =>
{
options.TokenValidationParameters.ValidateActor = false;
options.TokenValidationParameters.ValidateAudience = false;
options.TokenValidationParameters.ValidateIssuerSigningKey = false;
...
}
作为另一个选项,您可以通过将自己的实现设置为JwtBearerOptions.SignatureValidator
来覆盖默认令牌签名验证:
// Gets or sets a delegate that will be used to validate the signature of the token.
//
// Remarks:
// If set, this delegate will be called to signature of the token, instead of normal
// processing.
public SignatureValidator SignatureValidator { get; set; }
其中SignatureValidator
委托定义为:
public delegate SecurityToken SignatureValidator(string token, TokenValidationParameters validationParameters);
答案 2 :(得分:1)
我能够稍微清理一下代码,这表明我们可以更改标志并在设置标志时更加一致。
services.AddAuthentication(o =>
{
o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
o.RequireHttpsMetadata = false;
o.SaveToken = true;
o.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateIssuerSigningKey = false,
ValidateLifetime = false,
RequireExpirationTime = false,
RequireSignedTokens = false
};
});