ASP.NET MVC Вход по электронной почте вместо имени пользователя
Я пытаюсь создать новый проект с MVC 5 и OWIN под "Индивидуальными учетными записями пользователей". Проблема в том, что когда я регистрирую новую учетную запись, система требует, чтобы я ввел адрес электронной почты, после чего этот адрес электронной почты будет заполнен как адресом электронной почты, так и именем пользователя в базе данных. Когда я пытаюсь войти в систему, система запрашивает у меня адрес электронной почты, но сравнивает это письмо с колонкой " Имя пользователя". Таким образом, значения Email и Username одинаковы. Код входа в систему находится в действии Вход в систему (Account Controller)
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
Есть ли способы сравнить введенное письмо с колонкой Email вместо имени пользователя?
3 ответа
Отвечать:
Есть ли способы сравнить введенное письмо с колонкой Email вместо имени пользователя?
Вероятно, это не лучший ответ, но SignInManager должен иметь доступ к UserManager, который имеет свойство Users. Таким образом, вы можете найти пользователя по электронной почте, а затем с помощью результата вызвать метод входа.
Примерно так (не проверено):
var user = SignInManager.UserManage.Users.Where(u => u.email == model.Email).FirstOrDefault();
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
Вы хотели бы проверить, что user
был заполнен, в противном случае возвращаются неверные данные для входа в систему. Так же, как если бы PasswordSignInAsync
не удалось.
Вот что нужно сделать в соответствии с предложением @ChrisMoutray, найти имя пользователя для предоставленной электронной почты и войти в систему. Я разместил его здесь.
Создание пользовательского менеджера и входа в систему
private readonly SignInManager<ApplicationUser> signInManager;
private readonly UserManager<ApplicationUser> userManager;
public AccountController(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
{
this.signInManager = signInManager;
this.userManager = userManager;
}
а затем в задаче входа (сообщения):
var user = await userManager.FindByEmailAsync(model.Email);
var result = await signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);
PS. Нашел себя в этом старом посте, поэтому просто добавляю рабочее решение.
Причина в том, что когда вы регистрируетесь. Вы получаете имя пользователя = адрес электронной почты.
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);