使用正则表达式验证密码

时间:2020-07-13 00:41:07

标签: c# asp.net-mvc

我正在尝试创建符合某些条件的密码,例如:

  1. 至少有一个大写字母
  2. 至少一个小写字母
  3. 至少一个数字
  4. 一个非字母数字字符

我已经尝试过:

[StringLength(100, ErrorMessage = "The {0} must have a minimun of {2}and maximum of {1} characters long.", MinimumLength = 6)]
     [RegularExpression(@"^(?!.([A-Za-z0-9])\1{1})(?=.?[A-Z])(?=.?[a-z])(?=.?[0-9])(?=.?[#?!@$%^&-])$", ErrorMessage = "My error messaage in spanish lol")]
            public string NewPassword { get; set; }

但是,当我尝试输入“ Qwerty123”之类的密码时。它的行为像我收到错误消息时满足的某些条件或不满足任何条件。我的代码有什么问题?

2 个答案:

答案 0 :(得分:2)

ASP.NET MVC已经具有一个内置的验证器,可以执行所有这些操作,为什么您需要推出自己的验证器?

    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    
    manager.PasswordValidator = new PasswordValidator
    {
        RequiredLength = 6,
        RequireNonLetterOrDigit = true,
        RequireDigit = true,
        RequireLowercase = true,
        RequireUppercase = true,
        MaxLength = 10
    };

您可以通过将PasswordValidator子类化(或实现IIdentityValidator)来自定义密码验证器,并提供自己的实现。

答案 1 :(得分:0)

我将使用长度可变SELECT d.* FROM (SELECT d.deploy_location, COUNT(*) as cnt, RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum FROM deployed_bikes db JOIN rides r ON r.bike_id = dl.bike_id WHERE to_date(ride_date, 'YYYY-MON-DD') BETWEEN (current_date - 7) AND (current_date - 1)) GROUP BY d.deploy_location ) d WHERE seqnum = 1; 的正向超前行,因此表达式将如下所示:
(?=.*<condition>)
在哪里
^(?=.{10,20}$)(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[#?!@$%^&-]).*$定义最小和最大长度
(?=.{10,20}$)定义至少需要一次的所有字符

我猜您最大的错误是使用(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[#?!@$%^&-]),这将只允许组中的一个零或一个前面的字符,但是我不确定.?应该存档什么