如何动态设置JWTBeareOptions?
我正在开发一个以asp.net core 3.1为后端的多租户应用程序。我使用JWT对用户进行身份验证。我正在将tenantId与http请求一起传递,我想根据tenantId验证JWT。为此,我必须在每次客户端请求时将租户传递给JwtBearerOptions.validudience 我在启动时设置如下选项如何动态设置JWTBeareOptions?,jwt,asp.net-identity,asp.net-core-webapi,multi-tenant,asp.net-core-3.1,Jwt,Asp.net Identity,Asp.net Core Webapi,Multi Tenant,Asp.net Core 3.1,我正在开发一个以asp.net core 3.1为后端的多租户应用程序。我使用JWT对用户进行身份验证。我正在将tenantId与http请求一起传递,我想根据tenantId验证JWT。为此,我必须在每次客户端请求时将租户传递给JwtBearerOptions.validudience 我在启动时设置如下选项 public void ConfigureServices(IServiceCollection services){ services.AddAuthenticatio
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
};
});
}
请注意,我不想将所有租户都传递给ValidateAudiences,因为每个租户都应该收到一个唯一的令牌。e、 我不希望租户X的令牌对租户Y有效
我如何做到这一点
提前谢谢 我不确定为什么要将租户id设置为访问群体,但可以使用自定义访问群体验证器来实现TokenValidationParameters中的逻辑:
我不确定为什么要将租户id设置为访问群体,但可以使用自定义访问群体验证器实现TokenValidationParameters中的逻辑:
我最终使用下面的方法来验证tenderid,我对结果非常满意。请让我知道,如果有缺点,下面的方法,谢谢
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;
}
我最终使用下面的方法来验证tenderid,我对结果非常满意。请让我知道,如果有缺点,下面的方法,谢谢
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;
}
谢谢,我知道AudienceValidator代表,但我正在寻找一种在每次客户端请求时恢复TokenValidateParameters的方法。@ecasper我建议您使用AudienceValidator,而不是重新设置tokenvalidation参数,因为这不是最佳做法,AudienceValidator负责从标头中获取tenantId,并根据您的真实来源进行验证,管道结构不应因每个请求而变化,但处理程序应卸下负载并完成任务。HTHThanks,我知道AudienceValidator代表,但我正在寻找一种方法,在每次客户端请求时恢复TokenValidateParameters。@ecasper我建议您使用AudienceValidator,而不是重新实例化tokenvalidation参数,因为这不是最佳做法,AudienceValidator负责从标头中获取tenantId,并根据您的真实来源进行验证,管道结构不应因每个请求而变化,但处理程序应卸下负载并完成任务。什么是租户?你如何维护?什么是租户?你如何维护?