tutorial net mvc framework español asp and asp.net asp.net-mvc-5 asp.net-identity

mvc - Nombre de usuario de ASP.Net al correo electrónico



roles asp.net c# (7)

Estoy trabajando con la nueva Identidad de ASP.NET (RTM) y me preguntaba cómo continuaría cambiando el registro y el inicio de sesión de ser un nombre de usuario a un correo electrónico.

La idea es que quiero que mis usuarios se registren utilizando su correo electrónico y una contraseña (el correo electrónico también se puede adquirir utilizando un inicio de sesión externo) y configuran un nombre de usuario / nombre de usuario en la parte superior.

He mirado IdentityUser y puedo ver que UserName está allí, sin embargo, ya que está empaquetado en ASP.Net Identity que no se puede cambiar.

Sé que podría usar ''UserName'' como correo electrónico, con un validador personalizado y luego tener un atributo adicional para ApplicationUser llamado DisplayName, pero eso es más un hack que una solución.

Espero que mi pregunta sea clara. Gracias por adelantado.


Actualmente estoy trabajando en esta función para las plantillas de Identity 1.1 que cambiarán al correo electrónico y agregarán la confirmación de la cuenta / la funcionalidad de contraseña olvidada, y las dos opciones que consideramos fueron el pirateo (usar el nombre de usuario como correo electrónico con validación) y agregar un campo de correo electrónico adicional que está separado del nombre de usuario que es hacia lo que nos estamos inclinando.

Es probable que se agreguen algunos apis específicos de correo electrónico en 1.1 al UserManager:

FindByEmail SetEmail GetEmail


Cambie la propiedad UserValidator para su objeto UserManager:

public class UserManager : UserManager<User> { public IUserStore<User> Users { get; private set; } public UserManager(IUserStore<User> store) : base(store) { Users = store; UserValidator = new UserValidator<User>(this) {AllowOnlyAlphanumericUserNames = false}; } }



Consigo esto trabajando.

Primero, vaya a accountViewModels y agregue una propiedad para el nombre de usuario

<div class="form-group"> @Html.LabelFor(Function(m) m.UserName, New With {.class = "col-md-2 control-label"}) <div class="col-md-10"> @Html.TextBoxFor(Function(m) m.UserName, New With {.class = "form-control"}) </div> </div> <div class="form-group"> @Html.LabelFor(Function(m) m.Email, New With {.class = "col-md-2 control-label"}) <div class="col-md-10"> @Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"}) </div> </div>

Después de modificar su vista de Registro agregando la propiedad de nombre de usuario

@Html.ValidationSummary(True, "", New With {.class = "text-danger"}) <div class="form-group"> @Html.Label("User Name", New With {.class = "col-md-2 control-label"}) <div class="col-md-10"> @Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"}) @Html.ValidationMessageFor(Function(m) m.Email, "", New With {.class = "text-danger"}) </div> </div> <div class="form-group"> @Html.LabelFor(Function(m) m.Password, New With {.class = "col-md-2 control-label"}) <div class="col-md-10"> @Html.PasswordFor(Function(m) m.Password, New With {.class = "form-control"}) @Html.ValidationMessageFor(Function(m) m.Password, "", New With {.class = "text-danger"}) </div> </div>

Una vez hecho esto, modifique también su vista de inicio de sesión

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){ RegisterUser.Email = RegisterUser.UserName; }

Eso es todo lo que necesitas. De esta manera puede iniciar sesión con el nombre de usuario y no con la dirección de correo electrónico.


Mientras trabajaba en un problema similar, encontré que la solución más sencilla es etiquetar la entrada del nombre de usuario como "Correo electrónico" y luego configurar manualmente el correo electrónico de Membresía durante onCreating.

Public Class RegisterViewModel <Required> <Display(Name:="User Name")> Public Property UserName As String <Required> <EmailAddress> <Display(Name:="Email")> Public Property Email As String


Poco tarde en la fiesta, pero pensé que iba a tirar mis $ 0.02.

Si bien es cierto que UserName y Email son parte de IdentityUser y, por lo tanto, son necesarios, tenga en cuenta que ambos están marcados como virtual . Si desea que UserName y Email sean la dirección de correo electrónico, permita que el modelo de ApplicationUser encapsule la lógica de la siguiente manera:

public class ApplicationUser : IdentityUser { private string _userNameEmailBackingField; public override string UserName { get { return _userNameEmailBackingField; } set { _userNameEmailBackingField = value; } } public override string Email { get { return _userNameEmailBackingField; } set { _userNameEmailBackingField = value; } } //The rest of your ApplicationUser logic }

Luego, en su modelo de vista, exponga solo una propiedad individual y asigne una de las opciones a la de ApplicationUser , o asegúrese de decorarla con los atributos [Required] y [EmailAddress] .

Como han mencionado otros, deberá asegurarse de que AllowOnlyAlphanumericUserNames esté configurado en false para el UserManager del UserValidator , pero lo UserValidator de la caja con la plantilla web más nueva en VS2013.


Si realmente desea utilizar la dirección de correo electrónico para iniciar sesión, entonces, IMHO, el "truco" que sugirió es el mejor enfoque. Porque, si insistes en "hacerlo correctamente" tendrás que al menos

  • modificar el esquema de la base de datos, obviamente
  • asegúrate de que el nombre de usuario sea único (puedes hacer que una restricción / índice de la base de datos haga esto por ti, pero tendrás que encontrar una buena manera de lidiar con los errores e informarlos al usuario)
  • encuentre un buen sustituto para simplemente escribir "User.Identity.UserName" en su código
  • probablemente aún más

Por otro lado, si decides "hackear" el campo Nombre de usuario, debes

  • modifique la validación de RegisterViewModel (agregue [EmailAddress] a la propiedad UserName), probablemente personalice ligeramente [Display (Name = ...)] etc.
  • asegúrese de que la instancia UserManager.UserValidator utilizada en su AccountController permita caracteres especiales utilizados en las direcciones de correo electrónico. Para hacer esto, asegúrese de que su constructor no predeterminado tenga este aspecto:

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

Espero que esto pueda ayudarlo a evaluar las ventajas y desventajas de ambos enfoques y encontrar la mejor solución. ¡Buena suerte!