2016-07-25 16 views
0

Ich versuche, password mit for forget password-Funktionalität festzulegen.Zufälliges Kennwort generieren, das Active Directory-Passwortrichtlinien-Komplexitätsanforderungen programmatisch erfüllt

public string SetPassWord(string userName, string randomPassword) 
{ 
    string result = string.Empty; 
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); 
    AdUser adUser = new AdUser(); 
    if (user != null) 
    { 
     user.SetPassword(randomPassword); 
     result = "Success"; 
    } 
    return result; 
} 

Ich brauche das zufällige Passwort zu erzeugen, die die folgende Komplexität erfüllt:

  • nicht den Kontonamen des Benutzers enthält oder Teile des vollständigen Namen des Benutzers, der zwei aufeinanderfolgende Zeichen nicht überschreiten
  • Seien Sie mindestens sechs Zeichen Länge
  • Enthalten Zeichen aus drei der folgenden vier Kategorien:
    • Großbuchstaben (A bis Z)
    • Deutsche Kleinbuchstaben (a bis z)
    • Basis 10 Ziffern (0 bis 9)
    • Nicht alphabetische Zeichen (zum Beispiel!, $, #,%)

Komplexitätsanforderungen erzwungen werden, wenn Passwörter geändert oder erstellt.

Gibt es eine integrierte Methode, die den oben genannten Anforderungen entspricht? Ich habe unten Methode verwendet, um passwort randomely zu erzeugen:

Es wirft den Fehler, wenn ich versuche, Kennwort einzustellen. Schätzen Sie, ob es gibt und Validierung oder eingebaute Methode, um die obige Anforderung zu erfüllen.

+0

bin mit ich dich nicht auf Seiten generieren helfen können, aber ich könnte Ihnen einen regulären Ausdruck geben zu validieren. – sln

+0

Sie könnten immer 1-3 Artikel aus jeder Kategorie zufallsgenerieren und diese dann nach dem Zufallsprinzip mischen. Führen Sie sie dann zur Bestätigung durch einen Validierungsregex. IMO, die Validierung Regex ist schwieriger. Und mit 6 bis 9 Länge wäre nicht knackbar. – sln

+0

Diese Angabe enthält den Kontonamen des Benutzers oder Teile des vollständigen Benutzernamens, die zwei aufeinanderfolgende Zeichen überschreiten, erfordert eine separate Regex oder einen separaten Prozess. Der Rest kann mit einer einzigen Regex validiert werden. – sln

Antwort

0

Sehen Sie, ob so etwas für Sie funktioniert. Ich habe dies ursprünglich für .Net Identity 2 geschrieben, aber es sollte Sie in die richtige Richtung weisen. Sie können sehen, wie ich es auf GitHub

var validator = new PasswordValidator 
{ 
    RequiredLength = 6, 
    RequireNonLetterOrDigit = false, 
    RequireDigit = true, 
    RequireLowercase = true, 
    RequireUppercase = true 
}; 

passwords.Add(GeneratePassword(validator)); 


private static string GeneratePassword(PasswordValidator passwordValidator) 
{ 
    var rnd = new Random(); 

    while (true) 
    { 
     var password = Membership.GeneratePassword(passwordValidator.RequiredLength, 0); 
     if ((passwordValidator.RequireDigit && !password.Any(char.IsDigit)) || (passwordValidator.RequireLowercase && !password.Any(char.IsLower)) || (passwordValidator.RequireUppercase && !password.Any(char.IsUpper))) 
      continue; 

     if (!passwordValidator.RequireNonLetterOrDigit) password = Regex.Replace(password, @"[^a-zA-Z0-9]", m => rnd.Next(0, 10).ToString()); 
     return password; 
    } 
} 
+0

Es nicht überprüfen, dass nicht den Benutzernamen des Benutzers oder Teile des vollständigen Namen des Benutzers, die zwei aufeinander folgende Zeichen überschreiten Validierung –

+0

Sicher können Sie die Logik dafür schreiben – Eonasdan

+0

Ich habe die Logik für die gleichen geschrieben und es scheint gut zu funktionieren. Danke für die Richtung. –

0

Ich denke ActiveSirectoryMembershipProviders ResetPassword() Methode sollte genau das tun, was Sie suchen. MSDN - ActiveDirectoryMembershipProvider - ResetPassword()

+1

Von dieser Seite 'Das zufällige Kennwort, das von der ResetPassword-Methode erstellt wird, ist nicht garantiert, den regulären Ausdruck in der PasswordStrengthRegularExpression-Eigenschaft zu übergeben.' – sln

Verwandte Themen