我正在创建一个多租户的ASP.NET Core应用程序,用户可以属于一个或多个租户。当用户尝试进行身份验证时,我想生成一个以userId和tenantId为声明的JWT,以便API可以使用这些值,而不必每次都通过路由或正文对象传递它们。当前,如果一个用户仅与一个租户相关联,那么这很容易,我仅使用与他们相关联的唯一租户生成JWT tenantId声明。但是,如果用户与多个用户相关联,那么我的策略是什么?
从UI角度看,为清晰起见,请考虑使用标准的电子邮件/密码登录表单。如果与一个租户关联,则将您带到该租户的登录页面。如果与多个租户关联,则转到租户选择屏幕。
目前,我正在考虑我将使用JWT令牌的两种“类型”,即UserToken和TenantUserToken。 UserToken本质上只是一个成功通过身份验证的电子邮件/密码的userId,然后可以用于击中一些终结点,例如查看UserToken的userId与哪些联盟相关联,或者执行与任何特定的用户无关的常规用户管理工作承租人。 TenantUserToken将是带有tenantId的完全填充的令牌,并将成为大多数租户操作端点的主要身份验证者。以下是我在想的概括:
AppToken AuthenticateUser(string email, string password, int? tenantId)
{
var user = ValidateUser(email, password);
if(user == null){
//return error "email and/or password incorrect"
}
if(tenantId != null){
bool valid = ValidateTenantUser(user, tenantId);
if(valid){
//return error "user does not have access to tenant"
}else{
//return TenantUserToken
}
}
if(user.associatedTenants.count != 1){
//return UserToken
}else{
//return TenantUserToken
}
}
public class AppToken{
public string Token;
public TokenType TokenType; //enum of TenantUserToken or UserToken
}
我可能会对此深思熟虑,但是我已经花了很长时间思考了一下,以为我会伸出援手,看看是否还有其他人有想法?