如何动态设置JwtBearerOptions?

问题描述 投票:0回答:1

我正在开发一个以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 工作。

我如何实现这个目标?

先谢谢你

jwt asp.net-identity multi-tenant asp.net-core-3.1
1个回答
1
投票

我不知道为什么你要把 tenant id 设置为 Audience 但你可以使用自定义的受众验证器来实现以下逻辑 TokenValidationParameters :

AudienceValidator = (audiences, securityToken, validationParameters) =>
{
    //return true/false based on your requirement 
    return true;
},

0
投票

如果下面的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;
                }
© www.soinside.com 2019 - 2024. All rights reserved.