Стратегия многопользовательской аутентификации с JWT

Я создаю многопользовательское приложение ASP.NET Core, в котором пользователи могут принадлежать одному или нескольким клиентам. Когда пользователь пытается аутентифицироваться, я хотел бы сгенерировать JWT с userId и tenantId в качестве утверждений, чтобы API могли использовать эти значения вместо того, чтобы их приходилось каждый раз передавать через маршрут или объект тела. В настоящее время, если пользователь связан только с одним клиентом, это просто, я просто генерирую утверждение JWT tenantId с единственным, с которым они связаны. Но если пользователь связан более чем с одним, то какой будет моя стратегия?

Для ясности с точки зрения пользовательского интерфейса представьте стандартную форму входа по электронной почте / паролю. Если связано с одним арендатором, вы попадете на целевую страницу этого арендатора. Если связан с несколькими арендаторами, перейдите к экрану выбора арендатора.

В настоящее время я думаю, что у меня будет два «типа» токенов JWT: UserToken и TenantUserToken. UserToken, по сути, будет просто userId успешно аутентифицированного адреса электронной почты / пароля, который затем может быть использован для доступа к нескольким конечным точкам, например, для просмотра того, с какими лигами связан userId UserToken, или для выполнения общих действий по управлению пользователями, которые не связаны с каким-либо конкретным жилец. 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
}

Я вполне мог бы слишком обдумать это, но я крутил это достаточно долго, я думал, что протяну руку и посмотрю, есть ли у кого-нибудь еще мысль?

Вы можете сохранить все идентификаторы арендатора в токене (если они подходят) и сохранить дополнительное утверждение, которое является активным идентификатором арендатора. Тогда переключение арендатора, конечно, требует генерации нового токена. Просто идея :)

juunas 12.07.2018 11:38

@juunas Я тоже думал об этом. Сохраняя доступных арендаторов на токене, я бы также сэкономил поездку в БД, чтобы получить список арендаторов, но, как вы упомянули, в любое время, когда я хотел бы назначить активного арендатора, я бы генерировал новый токен.

Ben Krueger 12.07.2018 13:50

Используйте cookie для текущего арендатора.

Ruard van Elburg 13.07.2018 00:52

Привет, Бен, какое решение ты получил? Мы сталкиваемся с той же проблемой и думаем о выпуске нового токена, когда пользователь переходит на другого клиента. Спасибо!

lucbas 09.09.2019 23:15

@lucbas В итоге я построил свое приложение в контексте одного «текущего выбранного клиента», а затем выпустил новый токен, когда пользователь меняет клиента, и я был доволен результатом.

Ben Krueger 10.09.2019 19:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
1 301
0

Другие вопросы по теме