首页 > 解决方案 > 如何动态设置 JwtBearerOptions?

问题描述

我正在开发一个以 asp.net core 3.1 作为后端的多租户应用程序。我使用 JWT 对用户进行身份验证。我将tenantId 与http 请求一起传递,我想根据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
            };
        });
}

请注意,我不想将所有租户 ID 传递给 ValidateAudiences,因为每个租户都应该收到一个唯一的令牌。例如,我不希望租户 X 的令牌对租户 Y 有效。

我如何实现这一目标?

提前致谢!

标签: jwtasp.net-identityasp.net-core-webapimulti-tenantasp.net-core-3.1

解决方案


我不确定为什么要将租户 ID 设置为Audience,但您可以使用自定义受众验证器来实现以下逻辑TokenValidationParameters

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

推荐阅读