Шаблон ASP.NET позволяет регистрацию клиента с самообслуживанием

поэтому я пытаюсь создать приложение SaaS с помощью ASP.NET Boilerplate, и у меня возникла следующая проблема:

Наблюдая за фреймворком, я заметил, что функция RegisterAsync в UserRegistrationManager создает пользователя на основе текущего активного клиента. Это означает, что если я сейчас вхожу в систему под клиентом «1», то при регистрации нового пользователя у нового пользователя будет tenantId «1». С другой стороны, когда я в настоящее время не вошел в систему, если я зарегистрирую нового пользователя, приложение покажет исключение «не удается зарегистрировать пользователя хоста».

public async Task<User> RegisterAsync(string name, string surname, string emailAddress, string phoneNumber, string userName, string plainPassword, bool isEmailConfirmed)
        {
            CheckForTenant();

            var tenant = await GetActiveTenantAsync();

            var user = new User
            {
                TenantId = tenant.Id,
                Name = name,
                Surname = surname,
                EmailAddress = emailAddress,
                PhoneNumber = phoneNumber,
                IsActive = true,
                UserName = userName,
                IsEmailConfirmed = isEmailConfirmed,
                Roles = new List<UserRole>()
            };

            return user;
        }

private void CheckForTenant()
        {
            if (!AbpSession.TenantId.HasValue)
            {
                throw new InvalidOperationException("Can not register host users!");
            }
        }

Приложение, которое я хочу создать, требует, чтобы новый пользователь мог зарегистрироваться вместе с бесплатной пробной версией, а затем с платной подпиской. Поэтому я думаю, что новый пользователь должен иметь возможность самостоятельно создавать арендатора. Поэтому, если новый пользователь зарегистрируется, он будет вынужден создать нового клиента, прежде чем сможет делать что-либо еще в приложении.

Проблема в том, что столбец tenantId в таблице User не может быть нулевым, поэтому я могу зарегистрироваться без клиента. Сначала я подумываю назначить всех вновь созданных пользователей клиенту «По умолчанию», но я думаю, что это не лучший способ.

Есть ли способ решить эту проблему или какие-либо упоминания об этом? Заранее спасибо!


person Nosferatu    schedule 18.03.2019    source источник


Ответы (2)


Основываясь на моем эмпирическом опыте разработки приложений SaaS, типичный процесс самостоятельной регистрации в многопользовательских приложениях будет подобен приведенному ниже.

  1. Пользователь выбирает самостоятельный вход
  2. Разрешить пользователю выбрать план подписки (скорее всего, пробный план)
  3. Получите название компании (имя клиента) как часть процесса регистрации
  4. Создайте нового клиента с подпиской (2)
  5. Добавьте зарегистрированного пользователя в качестве администратора для этого клиента.
  6. В случае пробного плана настройте подходящий обработчик запросов, чтобы продолжать проверять, пересек ли клиент подписанное количество пробных дней, в этом случае принудительно перенаправьте на страницу оплаты или выйдите из системы.
  7. Если пользователь выбрал регистрацию для платной подписки (во время регистрации), после подготовки клиента перейдите на страницу оплаты. Как только платеж будет успешным, запишите идентификатор транзакции и разрешите пользователю войти в систему и использовать приложение.

Поток, который вы хотели использовать, прост.

  1. Создайте собственный процесс самостоятельной регистрации, получите название компании (Tenant Name)
  2. Также запишите адрес электронной почты пользователя, который выполняет регистрацию.
  3. Создайте арендатора на основе информации из (1)
  4. Установите администратора для арендатора на основе информации из (2)

Все ваши вызовы API должны работать нормально.

Примечание

  • Имейте отдельную службу саморегистрации, например (TenantSelfRegistrationService), чтобы вы могли разрешить анонимный доступ к этой службе.
  • Что касается безопасности, установите captcha и установите ограничения скорости или токены CSRF и т. Д., Чтобы обеспечить безопасность в процессе регистрации.

Надеюсь, это проясняет

person Saravanan    schedule 24.03.2019

Я просмотрел код и документацию и считаю, что вы никогда не должны позволять неизвестному пользователю создавать новых клиентов. Это должно происходить лицом, имеющим правильные полномочия для создания арендаторов. Это пользователь, который существует в хост-арендаторе. Вы, как администратор в главном арендаторе, должны создать арендатора для кого-то еще и добавить его в качестве администратора для этого арендатора.

Затем регистрация пользователей выполняется обычным способом с запущенной веб-страницей регистрации для этого клиента.

Как это сделать, я оставляю вам разобраться с документацией самого шаблона! Документация

person Schwarzie2478    schedule 18.03.2019
comment
Я не знаю об этом, но я думаю, что многие крупные службы SaaS, такие как Zoho и т. Д., Предлагают бесплатную пробную версию, когда пользователь может просто зарегистрировать своего пользователя и компанию (арендатора) самостоятельно, без необходимости создания хоста для них нового клиента, это плохая практика? - person Nosferatu; 18.03.2019
comment
Вам нужно будет зарегистрировать User с новым именем Tenant и настроить неавторизованный класс ApiController, которому разрешено создавать Tenants. Из этого. Затем пользователь создаст логин и предоставит имя арендатора. в своем коде вы должны создать нового клиента с помощью tenantService и одновременно создать пользователя в этом вновь созданном клиенте. - person Schwarzie2478; 18.03.2019
comment
Вы должны попытаться ограничить, сколько раз это может вызываться, тогда, потому что кто-то нажимает на это несколько раз, это может стать катастрофой. Возможно, поработайте с проверкой электронной почты, чтобы начать создание клиента. По крайней мере, это предотвращает большинство автоматических атак. - person Schwarzie2478; 18.03.2019
comment
Я тоже думаю об этом, но проблема в том, что в шаблоне ASP.NET, который я использую, объект «Пользователь» должен иметь TenantId, в то время как я хочу, чтобы пользователь был создан первым, но когда они входят в систему, они необходимо создать арендатора, прежде чем что-либо делать. Это невозможно из-за того, что я не могу создать пользователя без TenantId. Любые идеи? - person Nosferatu; 19.03.2019
comment
Вы не можете создать пользователя вне арендатора, вот и все. Вам необходимо создать арендатора в процессе создания пользователя, если этот пользователь запрашивает собственный арендатор. - person Schwarzie2478; 19.03.2019