我正在开发一个以asp.net core 3.1为后台的多租户应用程序。我使用JWT来验证用户。我在http请求中传递了tenantId,我想根据tenantIds验证JWT。要做到这一点,我必须在每个客户端请求时将 tenantIds 传递给 JwtBearerOptions.ValidAudience。
我在启动时设置的选项如下...
public void ConfigureServices(IServiceCollection services){
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(configureOptions =>
{
configureOptions.ClaimsIssuer = jwtOptions["Issuer"];
configureOptions.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = jwtOptions["Issuer"],
ValidAudience = tenantId,
ValidateIssuerSigningKey = true,
IssuerSigningKey = accessKey,
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
}
请注意,我不想将所有的 tenantIds 传递给 ValidateAudences,因为每个租户都应该收到一个唯一的令牌。例如,我不想让租户 X 的令牌为租户 Y 工作。
我如何实现这个目标?
先谢谢你
我不知道为什么你要把 tenant id 设置为 Audience
但你可以使用自定义的受众验证器来实现以下逻辑 TokenValidationParameters
:
AudienceValidator = (audiences, securityToken, validationParameters) =>
{
//return true/false based on your requirement
return true;
},
如果下面的approch有缺点,请告诉我,谢谢!
ValidAudiences = tenants.Value.Select(x=>x.TenantId).ToList(),
IssuerSigningKeyResolver = (string token, SecurityToken securityToken, string kid, TokenValidationParameters validationParameters) =>
{
var tenant = tenants.Value.Where(t => t.TenantId == kid).FirstOrDefault();
List<SecurityKey> keys = new List<SecurityKey>();
if (tenant != null && kid == tenantsResolver.GetCurrentTenantId())
{
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tenant.SecretKey));
keys.Add(signingKey);
}
return keys;
}