2016-07-25 7 views
0

Я пытаюсь установить пароль для функции забывания пароля.Генерировать случайный пароль, который соответствует требованиям сложности паролей в Active Directory Программно

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

мне нужно генерировать случайный пароль, который соответствует следующей сложности:

  • Не содержит имя учетной записи пользователя или части полного имени пользователя, который превышает два последовательных символов
  • быть, по крайней мере, шесть символов в длину
  • Содержит символы из трех следующих четырех категорий:
    • английских символы в верхнем регистре (от А до Z)
    • строчных буквы английского алфавита (от А до Z)
    • Base 10 цифр (от 0 до 9)
    • Non-буквенных символов (например,!, $, #,%)

требования Сложность исполняются, когда пароли изменены или созданы.

Есть ли встроенный метод, который обслуживает вышеуказанные требования? Я использовал метод ниже для генерации пароля случайным образом:

string randomPassword = Membership.GeneratePassword(8, 0).Replace('<','!').Replace('>', '#'); 

Он выдает ошибку, когда я пытаюсь установить пароль. Оцените, есть ли и валидация или встроенный метод для достижения вышеуказанного требования.

+0

Я не могу вам помочь в генерации части, но я мог бы дать вам регулярное выражение для проверки его. – sln

+0

Вы всегда можете произвольно генерировать 1-3 элемента из каждой категории, а затем произвольно смешивать их. Затем запустите их через регулярное выражение проверки правильности. IMO, регулярное выражение проверки является более сложным. И с длиной от 6 до 9 было бы невозможно взломать. – sln

+0

Это «Не содержать имя учетной записи пользователя или части полного имени пользователя, которое превышает два последовательных символа», требует отдельного регулярного выражения или процесса. Остальное можно проверить с помощью одного регулярного выражения. – sln

ответ

0

Посмотрите, подходит ли вам что-то подобное. Я изначально написал это для .Net Identity 2, но он должен указать вам в правильном направлении. Вы можете увидеть, как я использую его на 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

Это не проверка Не содержать имя учетной записи пользователя или части полного имени пользователя, которые превышают двух последовательных символов. –

+0

Конечно, вы можете написать логику для этого – Eonasdan

+0

Я написал логику для того же самого и, похоже, работает нормально. Спасибо за руководство. –

0

Я думаю, что использование метода ActiveDirectoryMembershipProvider's ResetPassword() должно делать именно то, что вы ищете. MSDN - ActiveDirectoryMembershipProvider - ResetPassword()

+1

С этой страницы 'Случайный пароль, созданный методом ResetPassword, не гарантирует прохождения регулярного выражения в свойстве PasswordStrengthRegularExpression.' – sln