ASP.Net UserName to Email
asp.net, asp.net-identity, asp.net-mvc-5
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!
Problem
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.