Регистрация нескольких пользователей с одной базой кода с использованием ASPNet.Identity - PullRequest
0 голосов
/ 29 ноября 2018

Итак, у меня есть несколько сайтов, работающих на одной кодовой базе (стандарт MVC asp.net).Я использую встроенные методы ASPNet.Identity для пользователей, чтобы зарегистрироваться / войти (используя ApplicationSignInManager, ApplicationUserManager).

В настоящее время все сайты используют одну базу данных для хранения информации о пользователях.Это вызывает пару проблем:

  1. Когда пользователь A регистрируется на веб-сайте A, он теперь может войти на веб-сайт B с теми же данными.Насколько им известно, они не регистрировались на веб-сайте B. Нехорошо!

  2. Если я ограничу пользователя A только доступом к веб-сайту A, если этот пользователь затем попытался зарегистрироваться на веб-сайтеB, они получают ошибку «адрес электронной почты уже используется».Тоже не хорошо!

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

Например, когда пользователь заходит на веб-сайт A, я беру строку подключения для веб-сайта A и выполняю действия входа в систему / регистрации.Мне нужно доменное имя, чтобы определить, какую строку подключения загрузить, и к которой я не могу получить доступ до тех пор, пока не запустится код startup.cs и не настроит экземпляры моего менеджера.

Я полагаю, что другие люди должны были это сделать.В идеале мне нужно динамически изменить DBContext ПОСЛЕ запуска. Startup.cs.В противном случае мне нужен хороший подход для хранения нескольких идентичных адресов электронной почты в одной БД

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

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

. В IdentityConfig.cs я переключил «RequireUniqueEmail» на false:

manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = false
};

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

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

Например,

string uniqueCode = "Website_Specific_String";
var user = new ApplicationUser { uniqueCode + model.Email, Email = model.Email};
var result = await UserManager.CreateAsync(user, model.Password);

и логин

var user = await UserManager.FindByNameAsync(uniqueCode  + model.Email);

Все еще открыты для лучших идей.Спасибо

0 голосов
/ 29 ноября 2018

Если у вас есть флаг где-то, для какого веб-сайта используется текущий контекст, я бы сказал, что проще всего это сделать двумя способами:

  • расширить IdentityUser с помощью свойства Website, что-то простоеили просто int WebsiteId или String.
  • Расширение AccountController для использования этого свойства там, где это необходимо, я думаю, вам нужно изменить функции «Регистрация» и все функции «Вход», чтобы проверить веб-сайт, для которого предназначена учетная запись.
...