带有JWT的多租户身份验证策略

时间:2018-07-11 19:59:01

标签: authentication asp.net-core jwt

我正在创建一个多租户的ASP.NET Core应用程序,用户可以属于一个或多个租户。当用户尝试进行身份验证时,我想生成一个以userId和ten​​antId为声明的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
}

我可能会对此深思熟虑,但是我已经花了很长时间思考了一下,以为我会伸出援手,看看是否还有其他人有想法?

0 个答案:

没有答案