Требования к паролю Regex

1

Я не могу сказать, насколько я ненавижу введение ограничений по паролю, но, увы, мой босс сделал это обязательным. Мне нужно регулярное выражение, которое удовлетворяет следующему:

  • Не менее 8 символов
  • Соединение символов верхнего и нижнего регистра
  • Не менее 2 цифр

Это то, что я получил до сих пор, но, похоже, удовлетворяет только одному условию:

[RegularExpression(@"^(?=.{8})(?=.*[^a-zA-Z])", ErrorMessage = "Password must contain at least 8 characters, a mix of uppercase and lowercase, and 2 numbers.")]
[DataType(DataType.Password)]
public string Password { get; set; }
  • 3
    Я не могу сказать вам, насколько я ненавижу устанавливать ограничения на пароли ... так что вы ненавидите защищать свои данные от злоумышленников? Я не совсем уверен, что делать с этим утверждением.
  • 0
    Я думаю, что пароль должен быть оставлен пользователю. Наложение ограничений облегчает взлом.
Показать ещё 7 комментариев
Теги:

2 ответа

2

Использование только lookaheads (?=), Синтаксис Perl:

^(?=.{8})(?=.*[a-z])(?=.*[A-Z])(?=.*\d.*\d)
  • 1
    Вы имели в виду ^(?=.{8})(?=.*[az])(?=.*[AZ])(?=.*\d.*\d) (вы забыли один ?= )?
  • 0
    @LucasTrzesniewski, да, точно, спасибо
Показать ещё 1 комментарий
0

Один способ с пользовательскими атрибутами:

    public class CustomPasswordAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null)
            {
                var password = value.ToString();

                if (password.Length < 8)
                    return new ValidationResult(ErrorMessage);

                var hasUpperCase = false;
                var hasLowerCase = false;
                var numDigits = 0;

                foreach (var c in password)
                {
                    if (char.IsUpper(c))
                        hasUpperCase = true;
                    else if (char.IsLower(c))
                        hasLowerCase = true;
                    else if (char.IsDigit(c))
                        numDigits++;
                }

                if (!hasUpperCase || !hasLowerCase || numDigits < 2)
                    return new ValidationResult(ErrorMessage);
            }

            return ValidationResult.Success;
        }
    }

Применение:

[CustomPassword(ErrorMessage = "Password must be at least 8 characters in length, contain both uppercase and lowercase characters, and at least 2 numbers.")]
public string Password { get; set; }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню