【问题标题】:How to set JwtBearerOptions dynamically?如何动态设置 JwtBearerOptions?
【发布时间】:2020-08-30 08:38:25
【问题描述】:

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

我如何做到这一点?

提前致谢!

【问题讨论】:

    标签: jwt asp.net-identity asp.net-core-webapi multi-tenant asp.net-core-3.1


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我知道 AudienceValidator 委托,但我正在寻找一种方法来在每个客户端请求时恢复 TokenValidateParameters。
    • @ecasper 我建议您使用 AudienceValidator 而不是重新实例化令牌验证参数,因为这不是最佳实践,AudienceValidator 是负责从标头并根据您的事实来源进行验证,管道构造不应因每个请求而变化,但处理程序应减轻负载并完成工作。 HTH
    【解决方案2】:

    我最终使用下面的方法来验证招标,我对结果非常满意。如果有不足之处请告诉我,谢谢!

                    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;
                    }
    

    【讨论】:

    • 什么是tenants,您如何维护它?
    猜你喜欢
    • 2021-09-18
    • 2021-05-31
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2018-03-15
    相关资源
    最近更新 更多