Я использую Membership.GeneratePassword () для генерации случайного пароля. Иногда возвращаемое значение не соответствует необходимым требованиям проверки. Пользователь также может предоставить пароль, отсюда и требования к валидации.
Я в основном хочу проверить возвращенный пароль, если он не содержит прописных букв, строчных букв и цифр, а затем сгенерирует еще один.
Иногда мой чек вернет true, тогда как, очевидно, нет.
Я попытался использовать RegEx и некоторые ссылки LINQ следующим образом:
string generatePassword()
{
password = System.Web.Security.Membership.GeneratePassword(16, 8);
if (password.Any(c => char.IsUpper(c)) && password.Any(c => char.IsDigit(c)) && password.Any(c => char.IsLower(c)))
{
return password;
}
else
{
generatePassword();
}
}
void test() {
var pattern = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()_\-+=[{\]};:<>|.\/\?])(?=.{8,})";
var count = 0;
for (var i = 0; i < 10000; i++)
{
var password = generatePassword();
if (!Regex.Match(password, pattern).Success)
{
Console.WriteLine(password);
count++;
}
}
Console.WriteLine("There were {0} non matches", count);
}
На мой взгляд, приведенное выше всегда должно возвращать действительный пароль. У меня есть странный сценарий, в котором он вернет пароль без цифры, поэтому проверка не пройдена, но если я сделаю то же самое passowrd.Any(char.IsDigit)
внутри test
для возвращенного пароля, он скажет true.
Если это поможет, пароль должен содержать не менее 8 цифр, содержать заглавные, строчные буквы, цифры и специальный символ: !@#$%^&*()_-+=[{]};:<>|./?
Спасибо.