Use Username instead of Email for identity in Asp.net mvc5

前端 未结 4 1252
南旧
南旧 2020-12-02 15:49

Whenever I create a new application with visual studio 2013 express for web and using the individual accounts authentication and i hit the register button I notice that it i

4条回答
  •  失恋的感觉
    2020-12-02 15:59

    Please look into this thread

    Thread Details :

    Assumptions:

    1. Username is unique for each user. It is either input by user or generated by application on registration.
    2. No @ symbol allowed in Username.

    Remove EmailAddress annotation and define Display text in the default LoginViewModel:

    public class LoginViewModel
    {
        [Required]
        [Display(Name = "Username/Email")]
        public string Email { get; set; }
    
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    
        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }
    }
    

    As user can enter either Username or Email, so we will make @ character for validation criteria. Here is the flow to be implemented:

    1. If in the string @ is present, apply Email validation else apply Username format validation.
    2. In case of valid Email, first we need to get Username. As it is considered that Username is unique so we can get it with userManager.FindByEmailAsync method.
    3. Use Username for SignIn verification.

      public async Task 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.Email))
             {
                 ModelState.AddModelError("Email", "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);
                 }
                 else
                 {
                      userName = user.UserName;
                 }
              }
              var result = await _signInManager.PasswordSignInAsync(userName, model.Password, model.RememberMe, lockoutOnFailure: false);
      

    No special need to change in View. Run the application and test login with Email or Username.

    Note: Keep in mind this tutorial follows MVC .Net Identity default structure.

提交回复
热议问题