如何动态设置JWTBeareOptions?

如何动态设置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

我正在开发一个以asp.net core 3.1为后端的多租户应用程序。我使用JWT对用户进行身份验证。我正在将tenantId与http请求一起传递,我想根据tenantId验证JWT。为此,我必须在每次客户端请求时将租户传递给JwtBearerOptions.validudience

我在启动时设置如下选项

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,并根据您的真实来源进行验证,管道结构不应因每个请求而变化,但处理程序应卸下负载并完成任务。什么是租户?你如何维护?什么是租户?你如何维护?