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);
Другие вопросы по тегам