我有一个asp net core api,我需要为"观众提供自定义验证"在JWT令牌中声明。
这可以通过AudienceValidator
代表(Microsoft.IdentityModel.Tokens)签名:
bool CustumValidator(IEnumerable<string> audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
根据我的理解,audiences
应包含令牌中的受众列表。 validationParameters
包含您在启动时注册的所有TokenValidationParameters
。 然而,对我来说这个参数是空的。
在我的启动类的configure方法中,如果有以下内容:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime applicationLifetime)
{
//...
// Setup JWT for the application.
var jwtAppSettingOptions = ConfigurationRoot.GetSection(nameof(JwtIssuerOptions));
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],
ValidateAudience = true,
//ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)], -- I have tried with both this property and the ValidAudiences one below
ValidAudiences = new[] { jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)] },
ValidateIssuerSigningKey = true,
IssuerSigningKey = _jwtSigningKey,
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
AudienceValidator = DoValidation // <-- my custom validation method, described below
};
//....
}
然后我有了这个小测试方法,现在除了返回true
之外什么也没做。
private bool DoValidation(IEnumerable<string> audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
{
var castedToken = securityToken as JwtSecurityToken;
// Do Nothing
return true;
}
如上所述,上述部分中的此标记在其受众属性中没有任何价值,IEnumerable<string> audiences
也是空的。我不懂为什么。如果我使用默认验证器方法(通过不设置委托),则能够看到令牌的受众,并且如果受众不正确则禁止访问。那么为什么我的自定义方法无法传入受众?
以下是我如何制作令牌:
var jwt = new JwtSecurityToken(
_jwtIssuerOptions.Issuer,
String.IsNullOrWhiteSpace(_aud) ? _jwtIssuerOptions.Audience : _aud,
claims,
_jwtIssuerOptions.NotBefore,
_jwtIssuerOptions.Expiration,
_jwtIssuerOptions.SigningCredentials);
提前致谢。
答案 0 :(得分:0)
我在尝试查找AudienceValidator委托的签名时遇到了这个问题。 (谢谢你!)
当我处理该委托时,我可以填充可枚举的受众群体。我看到的一个区别是我没有指定ValidAudiences参数。您可以尝试排除(假设您尚未解决此问题)。以下是我的工作代码示例:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "MyIssuer",
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["SecurityKey"])),
AudienceValidator = validateAudience
};
});