web-dev-qa-db-fra.com

Comment remplacer la stratégie de mot de passe d'ASP.NET Core Identity

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.

36
AdrienTorris

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 ...

97
AdrienTorris

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,
    };
}
1
Shashi Bhat