繁体   English   中英

基于多租户Asp.net核心网站中的参数的JWT身份验证

[英]JWT authentication based on the Parameter in Multi-tenant Asp.net Core web site

我在.net core 2.1网站上使用基于JWT的身份验证。 目前这工作正常。 现在,我必须创建一个API多租户,每个租户都有自己的密钥。 租户ID将作为参数传递给API。

        [Authorize]
        [HttpGet("tenant/{id}")]
        public async Task<IActionResult> GetInfo(string id)
        {
        }

每个租户都将签署JWT并将添加到Authorization标头。 我无法想到根据参数更改IssuerSigningKey的方法。 我试过以下:

  1. 通过将其AllowAonymus [ AllowAonymus ]来验证API中的JWT。 这有效但我最终编写了所有JWT验证代码。

  2. 实现ISecurityTokenValidator

我可以实现ISecurityTokenValidator来验证令牌并在启动配置中使用它,如下所示:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
            {
                options.SecurityTokenValidators.Clear();
                options.SecurityTokenValidators.Add(new JWTSecurityTokenValidator());
            });

并实现了我自己的类来验证令牌。

public class JWTSecurityTokenValidator : ISecurityTokenValidator
{
    public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
    {
            // Implement the logic
    }
}

但我又一次做了很重的事。 此外,我无法访问ValidateToken中的参数“tenantId”。

3.使用IssuerSigningKeyResolver :我可以实现委托:

IEnumerable<SecurityKey> IssuerSigningKeyResolver(string token, SecurityToken securityToken, string kid, TokenValidationParameters validationParameters)

同样,我无法访问“tenantId”参数来选择适当的密钥。

是否有基于参数选择IssuerSigningKey的优雅解决方案,这样我就不需要编写自己的逻辑来验证JWT了? 或者只有选择是第一个选项?

您可以使用DI将IHttpContextAccessor实例传递到JWTSecurityTokenValidator并获取IHttpContextAccessor.HttpContext属性的值。

从.Net Core 2.1,您可以使用扩展名注册:

services.AddHttpContextAccessor();

然后在您的自定义JWTSecurityTokenValidator ,修改以注入IHttpContextAccessor

private readonly IHttpContextAccessor _httpContextAccessor;

public JWTSecurityTokenValidator(IHttpContextAccessor httpContextAccessor) {
    _httpContextAccessor = httpContextAccessor;
}

修改Startup.cs的注册:

options.SecurityTokenValidators.Clear();

options.SecurityTokenValidators.Add(new JWTSecurityTokenValidator(services.BuildServiceProvider().GetService<IHttpContextAccessor>()));

因此,在ValidateToken方法中,您可以从_httpContextAccessor.HttpContext读取参数,根据您传递参数的方式,从查询字符串或路径中读取它:

public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
        var xx = _httpContextAccessor.HttpContext.Request;
        ........
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM