Hola, en el post anterior vimos como implementar un CustomPasswordValidation para implementar de reglas de negocio adicionales para el password cuando trabajamos con ASPNET Identity, así que hoy vamos a ver como lo podemos hacer sobre el resto de propiedades del usuario.

Si vamos a la clase IdentityConfig, método Create podemos encontrar la siguiente porción de código


// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = true
};

Y allí tan solo tenemos dos propiedades disponibles:

  • AllowOnlyAlphanumericUserNames: Si el nombre de usuario solo puede tener letras y números o no.
  • RequireUniqueEmail: Si el email debe ser único o no.

Ahora para poder extender dichas reglas, vamos a crear una clase CustomUserValidation, que debe heredar de UserValidator, donde T es la clase que define las propiedades del usuario, esa hereda de IdentityUser, si quieres ver como es posible agregar nuevas propiedades al usuario revisa el post del crack Eduard Tomás:Cambiar el esquema con ASP.NET Identity.

Luego de tener la clase creada, sobreescribimos el método ValidateAsync y allí usando el objeto item (de tipo ApplicationUser) es posible acceder a las propiedades del usuario y hacer las validaciones respectivas, en el ejemplo solo se valida que el email no tenga test, para que no nos vayan a trollear.


public class CustomUserValidation : UserValidator<ApplicationUser>
{
    public CustomUserValidation(ApplicationUserManager applicationUserManager)
        : base(applicationUserManager)
    {}

    public override async Task<IdentityResult> ValidateAsync(ApplicationUser item)
    {
        IdentityResult result = await base.ValidateAsync(item);
        if (item.Email.ToLower().Contains("test"))
        {
            var errors = result.Errors.ToList();
            errors.Add("Email invalid, this is a serious app!");
            result = new IdentityResult(errors);
        }
        return result;
    }
}

Ahora, volvemos al método Create de IdentityConfig y utilizamos la clase creada anteriormente:


// Configure validation logic for usernames
manager.UserValidator = new Infrastructure.CustomUserValidation(manager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = true
};

Ahora si probamos:

emailvalidation

Espero les sea interesante y no te olvides compartir!