web-dev-qa-db-fra.com

Comment définir les règles de mot de passe pour Identity dans ASP.NET 5 MVC 6 (vNext)?

Le fournisseur d'identité par défaut fourni dans ASP.NET 5 applique par défaut des règles de mot de passe très strictes, qui requièrent un caractère minuscule, un caractère majuscule, un caractère non alphanumérique et un nombre. Je cherche un moyen de modifier les exigences de mot de passe pour le fournisseur.

Auparavant dans ASP.NET 4, le fournisseur pouvait être configuré via le fichier XML Web.config, sous la forme réponse précédente . Cependant, ASP.NET 5 utilise le nouveau modèle de configuration basé sur code et il est difficile de savoir comment configurer l'identité.

Comment puis-je modifier les exigences de mot de passe pour mon application?

70
Ryan

En fait, j'ai fini par comprendre cela: il s'avère que vous devez fournir à AddDefaultIdentity une expression lambda appropriée qui configure les options IdentityOptions fournies. Cela se fait dans la méthode ConfigureServices de la classe Startup, comme suit:

public class Startup {
    public void ConfigureServices(IServiceCollection services) {

        // Add Identity services to the services container.
        services.AddDefaultIdentity<ApplicationIdentityDbContext, ApplicationUser, IdentityRole>(Configuration,
            o => {
                o.Password.RequireDigit = false;
                o.Password.RequireLowercase = false;
                o.Password.RequireUppercase = false;
                o.Password.RequireNonLetterOrDigit = false;
                o.Password.RequiredLength = 7;
            });
    }
}

Mise à jour 2:

Ce qui précède était vrai dans les versions beta1 du framework, dans la dernière rc1 beta5 il a légèrement changé en:

services.AddIdentity<ApplicationUser, IdentityRole>(o => {
    // configure identity options
    o.Password.RequireDigit = false;
    o.Password.RequireLowercase = false;
    o.Password.RequireUppercase = false;
    o.Password.RequireNonAlphanumeric = false;
    o.Password.RequiredLength = 6;
})
.AddEntityFrameworkStores<ApplicationIdentityDbContext>()
.AddDefaultTokenProviders();
131
Ryan

Si vous avez configuré un nouveau projet Web avec Individual User Accounts aller à:

App_Start -> IdentityConfig.cs

Là, vous pouvez éditer les valeurs par défaut suivantes:

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = true,
    RequireDigit = true,
    RequireLowercase = true,
    RequireUppercase = true,
};
25
Ogglas

dans startup.cs:

   services.AddIdentity<ApplicationUser, IdentityRole>(x =>
        {
            x.Password.RequiredLength = 6;
            x.Password.RequireUppercase = false;
            x.Password.RequireLowercase = false;
            x.Password.RequireNonAlphanumeric = false;
        }).AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
11
sadeghhp

Ce que je voulais faire était de personnaliser la règle de mot de passe afin qu'elle contienne les caractères de au moins 2 des groupes suivants: minuscule, majuscule, chiffres et symboles spéciaux.

Ce n'est pas quelque chose que je pourrais faire en modifiant simplement les options de PasswordValidator:

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = false,
    RequireDigit = false,
    RequireLowercase = false,
    RequireUppercase = false,
 };

Au lieu de cela, j'ai donc créé un validateur personnalisé en étendant IIdentityValidator ...

Tout d’abord, créez un nouveau fichier CustomPasswordValidator.cs dans votre dossier Extensions:

public class CustomPasswordValidator : IIdentityValidator<string>
{
    public int RequiredLength { get; set; }
    public CustomPasswordValidator(int length) {
        RequiredLength = length;
    }

    /* 
     * logic to validate password: I am using regex to count how many 
     * types of characters exists in the password
     */
    public Task<IdentityResult> ValidateAsync(string password) {
        if (String.IsNullOrEmpty(password) || password.Length < RequiredLength)
        {
            return Task.FromResult(IdentityResult.Failed(
                String.Format("Password should be at least {0} characters", RequiredLength)));
        }

        int counter = 0;
        List<string> patterns = new List<string>();
        patterns.Add(@"[a-z]");                                          // lowercase
        patterns.Add(@"[A-Z]");                                          // uppercase
        patterns.Add(@"[0-9]");                                          // digits
        // don't forget to include white space in special symbols
        patterns.Add(@"[!@#$%^&*\(\)_\+\-\={}<>,\.\|""'~`:;\\?\/\[\] ]"); // special symbols

        // count type of different chars in password
        foreach (string p in patterns)
        {
            if (Regex.IsMatch(password, p))
            {
                counter++;
            }
        }
        if (counter < 2)
        {
            return Task.FromResult(IdentityResult.Failed(
                "Please use characters from at least two of these groups: lowercase, uppercase, digits, special symbols"));
        }
        return Task.FromResult(IdentityResult.Success);
    }
}

Ensuite, accédez à IdentityConfig.cs et initialisez-le dans la méthode Create:

manager.PasswordValidator = new CustomPasswordValidator(6 /*min length*/);
        /*
        // You don't need this anymore
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };
        */
6
Hooman Bahreini