gpt4 book ai didi

c# - Multi-Tenancy Asp.net Core网站中基于参数的JWT认证

转载 作者:行者123 更新时间:2023-11-30 15:51:20 26 4
gpt4 key购买 nike

我在我的 .net core 2.1 网站中使用基于 JWT 的身份验证。目前这工作正常。现在,我必须让一个 API 成为 Multi-Tenancy ,每个租户都将拥有自己的 key 。租户 ID 将作为参数传递给 API。

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

每个租户都将签署 JWT 并将添加到授权 header 。我想不出一种方法来根据参数更改 IssuerSigningKey。我试过以下:

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

  2. 实现ISecurityTokenValidator

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

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

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

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

但我又一次完成了繁重的工作。此外,我无法访问 ValidateToken 中的参数“tenantId”。

3.使用IssuerSigningKeyResolver:我可以实现一个委托(delegate):

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

同样,我无权访问“tenantId”参数来选择适当的 key 。

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

最佳答案

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

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

services.AddHttpContextAccessor();

然后在您的自定义 JWTSecurityTokenValidator 中,修改以注入(inject) 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;
........
}

关于c# - Multi-Tenancy Asp.net Core网站中基于参数的JWT认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com