Par défaut, la stratégie de mot de passe d'ASP.NET Core Identity requiert au moins un caractère spécial, une lettre majuscule, un chiffre, ...
Comment puis-je changer ces restrictions?
Il n'y a rien à ce sujet dans la documentation ( https://docs.asp.net/fr/latest/security/authentication/identity.html )
J'essaie de remplacer le gestionnaire d'utilisateurs d'Identity, mais je ne vois pas quelle méthode gère la stratégie de mot de passe.
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()
};
}
}
}
J'ajoute cette dépendance du gestionnaire d'utilisateurs dans la classe de démarrage:
services.AddScoped<ApplicationUserManager>();
Mais lorsque j'utilise ApplicationUserManager dans les contrôleurs, le message d'erreur suivant s'affiche: Une exception non gérée s'est produite lors du traitement de la demande.
InvalidOperationException: Impossible de résoudre le service pour le type 'Microsoft.EntityFrameworkCore.DbContextOptions`1 [SecurityDbContext]' lors de l'activation de 'ApplicationUserManager'.
EDIT: La gestion de l'utilisateur fonctionne lorsque j'utilise les classes par défaut d'ASP.NET Core Identity. Ce n'est donc pas un problème de base de données ou quelque chose du genre.
EDIT 2: J'ai trouvé la solution, il ne vous reste plus qu'à configurer Identity dans la classe de démarrage. Ma réponse donne quelques détails.
C'est tellement simple à la fin ...
Pas besoin de remplacer n'importe quelle classe, il vous suffit de configurer les paramètres d'identité dans votre classe de démarrage, comme ceci:
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 5;
options.Password.RequireLowercase = true;
options.Password.RequireNonLetterOrDigit = true;
options.Password.RequireUppercase = false;
});
Ou vous pouvez configurer l'identité lorsque vous l'ajoutez:
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 est définitivement une bonne chose ...
Vous pouvez modifier ces règles dans le fichier IdentityConfig.cs . Les règles sont définies dans
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,
};
}