我在 .net core 2.1 网站中使用基于 JWT 的身份验证。目前这工作正常。现在,我必须创建一个 API 多租户,并且每个租户都将拥有自己的密钥。租户 ID 将作为参数传递给 API。
[Authorize]
[HttpGet("tenant/{id}")]
public async Task<IActionResult> GetInfo(string id)
{
}
每个租户都会签署 JWT 并添加到授权标头。我无法想出一种根据参数更改 IssuerSigningKey 的方法。我尝试了以下操作:
通过将其设置为[来验证 API 内的 JWTAllowAonymus
]。这可行,但我最终编写了所有 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.Using IssuerSigningKeyResolver
:
我可以实现一个委托:
IEnumerable<SecurityKey> IssuerSigningKeyResolver(string token, SecurityToken securityToken, string kid, TokenValidationParameters validationParameters)
同样,我无法访问“tenantId”参数来选择适当的密钥。
有没有优雅的解决方案可供选择IssuerSigningKey
基于参数,这样我就不需要编写自己的逻辑来验证 JWT?或者唯一的选择是选择第一个选项?