[英]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的方法。 我试过以下:
通过将其AllowAonymus
[ AllowAonymus
]来验证API中的JWT。 这有效但我最终编写了所有JWT验证代码。
实现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.