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

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 implements ‘Email’ instead of ‘Username’ and the same is in the LoginViewModel as it uses Email to Sign in instead of Username. How can i change this to use Username instead of the default Email without trouble? Also i would like to know how to convert the default ‘guid’ that is a string type to ‘id’ (integer type).

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

The linked question in the accepted answer descibes how to use Email instead of UserName, OP wanted the UserName instead of email which is what I was looking for in Identity 2.0 in an MVC project.

In case anyone else gets here from a google search it is actually very easy to do this. If you look at the register post action it is simply setting the UserName to the Email address. So………

Add UserName to the RegisterViewModel and add it to the register view.

<div class="form-group">
        @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "Username or email" })
        </div>
</div>

In the Register Post Action on the AccountController set the UserName to the ViewModel’s UserName and the Email to the ViewModel’s Email.

var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };

Method 2

In order to make email as non unique:

Configure below in IdentityConfig

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

Method 3

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<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.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.

Method 4

You can also use username and/or password like this

var user = await _userManager.Users
       .FirstOrDefaultAsync(u => u.UserName == username || u.Email == username);

if (user != null){
var result = await _signInManager
            .PasswordSignInAsync(user.Email, password, false, false);
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x