Я не могу сказать, насколько я ненавижу введение ограничений по паролю, но, увы, мой босс сделал это обязательным. Мне нужно регулярное выражение, которое удовлетворяет следующему:
Это то, что я получил до сих пор, но, похоже, удовлетворяет только одному условию:
[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; }
Использование только lookaheads (?=)
, Синтаксис Perl:
^(?=.{8})(?=.*[a-z])(?=.*[A-Z])(?=.*\d.*\d)
^(?=.{8})(?=.*[az])(?=.*[AZ])(?=.*\d.*\d)
(вы забыли один ?=
)?
Один способ с пользовательскими атрибутами:
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; }