c# - español - asp.net core 2.1 identity
Cómo anular la política de contraseña de ASP.NET Core Identity (2)
De forma predeterminada, la política de contraseñas de ASP.NET Core Identity requiere al menos un carácter especial, una letra mayúscula, un número, ...
¿Cómo puedo cambiar estas restricciones?
No hay nada sobre eso en la documentación ( https://docs.asp.net/en/latest/security/authentication/identity.html )
Intento anular el Administrador de usuarios de Identity, pero no veo qué método administra la política de contraseña.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(
DbContextOptions<SecurityDbContext> options,
IServiceProvider services,
IHttpContextAccessor contextAccessor,
ILogger<UserManager<ApplicationUser>> logger)
: base(
new UserStore<ApplicationUser>(new SecurityDbContext(contextAccessor)),
new CustomOptions(),
new PasswordHasher<ApplicationUser>(),
new UserValidator<ApplicationUser>[] { new UserValidator<ApplicationUser>() },
new PasswordValidator[] { new PasswordValidator() },
new UpperInvariantLookupNormalizer(),
new IdentityErrorDescriber(),
services,
logger
// , contextAccessor
)
{
}
public class PasswordValidator : IPasswordValidator<ApplicationUser>
{
public Task<IdentityResult> ValidateAsync(UserManager<ApplicationUser> manager, ApplicationUser user, string password)
{
return Task.Run(() =>
{
if (password.Length >= 4) return IdentityResult.Success;
else { return IdentityResult.Failed(new IdentityError { Code = "SHORTPASSWORD", Description = "Password too short" }); }
});
}
}
public class CustomOptions : IOptions<IdentityOptions>
{
public IdentityOptions Value { get; private set; }
public CustomOptions()
{
Value = new IdentityOptions
{
ClaimsIdentity = new ClaimsIdentityOptions(),
Cookies = new IdentityCookieOptions(),
Lockout = new LockoutOptions(),
Password = null,
User = new UserOptions(),
SignIn = new SignInOptions(),
Tokens = new TokenOptions()
};
}
}
}
Añado esta dependencia del administrador de usuarios en la clase de inicio:
services.AddScoped<ApplicationUserManager>();
Pero cuando uso ApplicationUserManager en los controladores, aparece el error: se produjo una excepción no controlada al procesar la solicitud.
InvalidOperationException: no se puede resolver el servicio para el tipo ''Microsoft.EntityFrameworkCore.DbContextOptions`1 [SecurityDbContext]'' al intentar activar ''ApplicationUserManager''.
EDITAR: la administración del usuario funciona cuando uso las clases predeterminadas de ASP.NET Core Identity, por lo que no es un problema de base de datos, o algo así
EDIT 2: encontré la solución, solo tienes que configurar la identidad en la clase de inicio. Mi respuesta da algunos detalles.
Es muy simple al final ...
No es necesario anular ninguna clase, solo tiene que configurar los ajustes de identidad en su clase de inicio, como esto:
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 5;
options.Password.RequireLowercase = true;
options.Password.RequireNonLetterOrDigit = true;
options.Password.RequireUppercase = false;
});
O puedes configurar la identidad cuando la agregues:
services.AddIdentity<ApplicationUser, IdentityRole>(options=> {
options.Password.RequireDigit = false;
options.Password.RequiredLength = 4;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
})
.AddEntityFrameworkStores<SecurityDbContext>()
.AddDefaultTokenProviders();
AS.NET Core es definitivamente una buena cosa ...
Puede modificar estas reglas en el archivo IdentityConfig.cs. Las reglas se definen en
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 5,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
}