tutorial tables net framework español asp c# asp.net-identity-2

c# - tables - Asp.Net Identity guarda usuario sin correo electrónico



asp.net identity web api (4)

Quiero guardar usuario sin correo electrónico, como este:

var user = new ApplicationUser { UserName = model.Name }; var result = await UserManager.CreateAsync(user);

Pero recibí el error "El correo electrónico no puede ser nulo o vacío". ¿Hay alguna solución para esto? ¿O es imposible?


ASP Identity 2.2 se puede configurar en App_Start/IdentityConfig.cs

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


En realidad hay una manera mejor. Modifique la validación solo cuando necesite ignorarla y luego vuelva a restaurarla cuando haya terminado. (No utilice async en este caso porque podría ser necesario actualizar otro hilo (?))

// first create/update the identity!!! user.PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password); //hash and update directly // alter UserManager.UserValidator = new UserValidator<StoreUser>(UserManager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = false }; var result = UserManager.Update(user); // restore... UserManager.UserValidator = new UserValidator<StoreUser>(UserManager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true };


La identidad depende del correo electrónico como una forma de restablecer la contraseña del usuario.

Sin embargo, ignorar el correo electrónico no es simple, sino posible. Necesitará implementar la interfaz Microsoft.AspNet.Identity.IIdentityValidator que ignora la falta de correo electrónico:

namespace Microsoft.AspNet.Identity { /// <summary> /// Used to validate an item /// /// </summary> /// <typeparam name="T"/> public interface IIdentityValidator<in T> { /// <summary> /// Validate the item /// /// </summary> /// <param name="item"/> /// <returns/> Task<IdentityResult> ValidateAsync(T item); } }

Y luego, en ApplicationUserManager asigne su propia implementación a la propiedad UserValidator .

Si realmente necesita esto, puede obtener el código fuente original para UserValidator descompilando la clase Microsoft.AspNet.Identity.UserValidator y UserValidator un vistazo al código fuente existente y eliminar cheecking para correo electrónico.

Sin embargo, no estoy seguro de cómo reaccionará el resto del marco ante la falta de correo electrónico en el usuario. Probablemente obtendrá excepciones en otras operaciones.


Sé que esto es antiguo, pero no estoy de acuerdo con la respuesta aceptada, ya que la pregunta está etiquetada como asp.net-identity-2. Para el beneficio de los futuros lectores, ASP.NET Identity 2.0 tiene una solución muy simple para este problema:

public class ApplicationUserManager : UserManager<ApplicationUser> { ...snip... public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); manager.UserValidator = new UserValidator<ApplicationUser>(manager) { // This disables the validation check on email addresses RequireUniqueEmail = false }; ...snip... } }

En UserValidator<TUser> , la UserValidator<TUser> la Task<IdentityResult> ValidateAsync(T item) comprueba este indicador y determina si se debe ejecutar la validación de correo electrónico:

if (this.RequireUniqueEmail) { await this.ValidateEmail(item, list); }

Dado que desea guardar usuarios sin una dirección de correo electrónico, esta es la forma en que debe hacerlo.

PRECAUCIÓN : esto solo debe usarse cuando no se recopilan las direcciones de correo electrónico. Si desea recopilar y validar direcciones de correo electrónico, pero hacerlas opcionales durante el registro, debe utilizar un IIdentityValidator personalizado.