Wie definiere ich die Kennwortregeln für Identität in ASP.NET 5 MVC 6 (vNext)?

75

Der in ASP.NET 5 bereitgestellte Standard-Identitätsanbieter hat standardmäßig sehr strenge Kennwortregeln, die ein Kleinbuchstaben, ein Großbuchstaben, ein nicht alphanumerisches Zeichen und eine Zahl erfordern. Ich suche nach einer Möglichkeit, die Passwortanforderungen für den Anbieter zu ändern.

Zuvor konnte der Anbieter in ASP.NET 4 wie zuvor beantwortet über die XML-Datei Web.config konfiguriert werden . ASP.NET 5 verwendet jedoch das neue codebasierte Konfigurationsmuster und es ist unklar, wie die Identität konfiguriert werden soll.

Wie kann ich die Passwortanforderungen für meine Anwendung ändern?

Ryan
quelle
2
Wenn Sie sich eingehend mit den Kennwortanforderungen befassen möchten (und dies wahrscheinlich auch tun sollten), hat NIST (ein Standard Board) kürzlich neue Kennwortrichtlinien herausgebracht. Einen zusammenfassenden Artikel finden Sie hier: passwordping.com/surprising-new-password-guidelines-nist Und die vollständige NIST Standard-Veröffentlichung hier. Siehe Abschnitt 5.1.1.2: pages.nist.gov/800-63-3/sp800-63b.html#sec3
Francisco d'Anconia

Antworten:

138

Ich habe dies tatsächlich herausgefunden. Es stellt sich heraus, dass Sie AddDefaultIdentity mit einem geeigneten Lambda-Ausdruck versorgen müssen, der die von ihm bereitgestellten IdentityOptions konfiguriert. Dies erfolgt innerhalb der ConfigureServices-Methode innerhalb der Startup-Klasse wie folgt:

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;
            });
    }
}

Update 2:

Das Obige galt für die Beta1-Versionen des Frameworks, in der neuesten rc1 Beta5 hat sich dies geringfügig geändert in:

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();
Ryan
quelle
4
Ja, oder Sie können einfach direkt services.ConfigureIdentity (o => {}) aufrufen.
Hao Kung
2
Nett! Glaubst du, dass es über die config.jsonDatei möglich ist?
Dave Van den Eynde
@ DaveVandenEynde Ich habe es gerade versucht. Funktioniert nicht. json unten. "Identität": {"Passwort": {"RequireDigit": "false", "RequireLowercase": "false", "RequiredLength": "5", "RequireUppercase": "false", "RequireNonLetterOrDigit": "false"} }
nVentimiglia
Nach dem, was ich über MVC 6 lerne, ist es meiner Meinung nach Sache des Programmierers , Denkweisen konfigurierbar zu machen , indem er sie beim Start der App explizit aus der Konfiguration liest.
Dave Van den Eynde
1
Schauen Sie sich auch diese Lösung an, um Optionen nach der Initialisierung festzulegen
Jannik Arndt
27

Wenn Sie ein neues Webprojekt eingerichtet haben, Individual User Accountsgehen Sie zu:

App_Start -> IdentityConfig.cs

Dort können Sie folgende Standardeinstellungen bearbeiten:

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

in 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();
sadeghhp
quelle
Dies ist die Antwort für Core 2.0. Vielen Dank.
Horseman1210
8

Ich wollte die Kennwortregel so anpassen, dass sie Zeichen aus mindestens zwei der folgenden Gruppen enthält: Kleinbuchstaben, Großbuchstaben, Ziffern und spezielle Symbole .

Dies kann ich nicht tun, indem ich nur die PasswordValidator-Optionen ändere:

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

Also habe ich stattdessen einen benutzerdefinierten Validator erstellt, indem ich IIdentityValidator erweitert habe ...

Erstellen Sie zunächst eine neue Datei CustomPasswordValidator.cs in Ihrem Erweiterungsordner:

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);
    }
}

Gehen Sie dann zu IdentityConfig.cs und initialisieren Sie es in der Create-Methode:

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

Weitere Informationen finden Sie in meinem Tutorial .

Hooman Bahreini
quelle
2
Ich denke, dies ist die beste Lösung für den Benutzer. Dies ermöglicht ein angemessenes Sicherheitsniveau und bietet dem Benutzer Flexibilität. Anstatt bestimmte Einschränkungen zu aktivieren oder zu deaktivieren, kann der Benutzer auf diese Weise mit seinem Kennwort auswählen, was er möchte.
Francisco d'Anconia