Asp.net личность ищет электронную почту в столбце имени пользователя в базе данных - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь использовать электронную почту для аутентификации при входе в систему в качестве удостоверения asp.net, поэтому я создал поле имени пользователя в форме регистрации, но при попытке войти в систему я получаю сообщение об ошибке неверной попытки входа в систему. Итак, в таблице пользователей asp.net я скопировал введенное электронное письмо и поместил его в столбец имени пользователя таким образом, что я успешно вошел в систему вот моя таблица пользователей

Итак, он ищет электронную почту в столбце имени пользователя. Как решить эту проблему? это мой метод входа

        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

это мой метод регистрации

   public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Name, Email = model.Email,};
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

                return RedirectToAction("Index", "Home");
            }
            AddErrors(result);
        }
        return View(model);
    }

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Метод ищет имя пользователя вместо электронной почты, потому что вы делаете ошибку.

Это перегрузки PasswordSignInAsync.

Перегрузки

PasswordSignInAsync(String, String, Boolean, Boolean)

Пытается войти в указанную комбинацию имени пользователя и пароля как асинхронную операцию.

PasswordSignInAsync(TUser, String, Boolean, Boolean)

Пытается войти в указанную комбинацию пользователя и пароля какасинхронная операция.

Итак, в вашем случае вы просто используете первую.

Редактировать Чтобы использовать вторую перегрузку, просто найдитепользователь с такой записью.

var user=await userManager.FindByEmailAsync(vm.Email);

var result=await signInManager.PasswordSignInAsync(user,vm.Password,false,false);

if(result.Succeeded){
//Do some other things.
}
0 голосов
/ 15 мая 2019

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

  1. Если в строке присутствует @, примените проверку электронной почты, иначе примените проверку формата имени пользователя.
  2. В случае действительного адреса электронной почты, сначала нам нужно получить имя пользователя. Поскольку считается, что имя пользователя уникально, мы можем получить его с помощью метода userManager.FindByEmailAsync.
  3. Использовать имя пользователя для подтверждения входа.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (model.Email.IndexOf('@') > -1)
    {
        //Validate email format
        string emailRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                               @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                                  @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
        Regex re = new Regex(emailRegex);
        if (!re.IsMatch(model.Email))
        {
            ModelState.AddModelError("Email", "Email is not valid");
        }
    }
    else
    {
        //validate Username format
        string emailRegex = @"^[a-zA-Z0-9]*$";
        Regex re = new Regex(emailRegex);
        if (!re.IsMatch(model.Username))
        {
            ModelState.AddModelError("Username", "Username is not valid");
        }
    }

    if (ModelState.IsValid)
    {
        var userName = model.Email;
        if (userName.IndexOf('@') > -1)
        {
            var user =  await _userManager.FindByEmailAsync(model.Email);
            if (user == null)
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return View(model);
            }

        }
        var result = await _signInManager.PasswordSignInAsync(user, model.Password, model.RememberMe, lockoutOnFailure: false);
    }
}
public class LoginViewModel
    {
        [Required]
        [Display(Name = "Username")]
        public string Username{ get; set; }

        [Required]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }
    }
...