Search code examples
asp.netasp.net-mvc-5asp.net-identity

ASP.Net UserName to Email


I am working with the new ASP.NET Identity (RTM) and I was wondering how would I go on about changing registering and login from being a UserName to an Email.

The idea is that I want my users to sign up using their e-mail and a password (e-mail can also be acquired using external login) and they set-up a display name/username on top.

I've looked at IdentityUser and I can see that UserName is there, however since that is packed in ASP.Net Identity that can not be changed.

I know I could use 'UserName' as a e-mail, with a custom validator and then have an extra attribute for ApplicationUser called DisplayName but that is more of a hack than a solution.

I hope my question is clear. Thanks in advance.


Solution

  • If you really want to use e-mail address to log in, then, IMHO, the "hack" you suggested is the best approach. Because, if you insist on "doing it properly" you'll have to at least

    • modify the database schema, obviously
    • ensure username uniqueness yourself (you could make a database constraint/index do this for you, but you'll have to find a good way to deal with errors and reporting them to the user)
    • find a good substitute for just writing "User.Identity.UserName" in you code
    • probably even more

    On the other hand, if you decide to "hack" the UserName field you need to

    • modify RegisterViewModel validation (add [EmailAddress] to the UserName property), probably slightly customize [Display(Name=...)] etc.
    • make sure UserManager.UserValidator instance used in your AccountController allows special characters used in e-mail addresses. To do this, make sure its nondefault constructor looks like this:

      public AccountController(UserManager<ApplicationUser> userManager)
      {
          UserManager = userManager;
          var userValidator = UserManager.UserValidator as UserValidator<ApplicationUser>;
          userValidator.AllowOnlyAlphanumericUserNames = false;
      }
      

    I hope this could help you weigh the pros and cons of both approaches and come up with the best solution. Good luck!