[英]Ignore JWT Bearer token signature (i.e. don't validate token)
我有一个位于 API 网关后面的 API。 API 网关在将请求传递给 API 之前验证不记名令牌。
我的 API 使用 asp.net core 2.0 本机身份验证和基于声明的授权框架。 从 JWT 令牌获取声明的繁重工作由Microsoft.AspNetCore.Authentication.JwtBearer
的中间件完成。
这个中间件可以配置为忽略令牌上的到期日期,也可以指定一个本地公钥,这样就不需要联系令牌授权来获取一个,但是否可以只禁用签名验证令牌?
这将允许在开发中使用未签名的令牌进行临时测试,并防止生产中的双重验证(网关和 API)。
试试这个。 终于,经过这么多的尝试,我让它工作了。
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;
}
您可以使用JwtBearerOptions.TokenValidationParameters
设置令牌验证。 您可以检查类定义中的所有可用参数。
包含了一组由使用的参数
Microsoft.IdentityModel.Tokens.SecurityTokenHandler
在验证时Microsoft.IdentityModel.Tokens.SecurityToken
。
如果您想完全禁用验证,请将所有ValidateXXX
和RequireXXX
bool 属性设置为 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);
我能够稍微清理一下代码,表明我们可以只更改标志,并且在设置标志时更加一致。
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
};
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.