【问题标题】:RequireNonLetterOrDigit not correctly validatedRequireNonLetterOrDigit 未正确验证
【发布时间】:2014-09-16 10:06:59
【问题描述】:

我创建了一个密码验证器,如下所示:

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 8,
    RequireNonLetterOrDigit = false, 
    RequireDigit = false,
    RequireLowercase = true,
    RequireUppercase = true,
};

但是,像Testing123这样的密码被认为是无效的:

密码必须至少包含一个非字母或数字字符。

错误信息很不清楚,它说密码应该至少有一个非字母数字字符。嗯,我有3位数。那么有什么问题呢?当我添加一个非字母时

【问题讨论】:

  • 您的意思是 RequireNonLetterOrDigit = true 吗?

标签: asp.net asp.net-identity


【解决方案1】:

此属性的名称和documentation 不明确。这应该是:

获取或设置密码是否需要一个不是 字母而不是数字。

【讨论】:

  • 这是有道理的。谢谢!
【解决方案2】:
    public class CustomPasswordValidator : PasswordValidator
{
    public override async Task<IdentityResult> ValidateAsync(string password)
    {
        var requireNonLetterOrDigit = base.RequireNonLetterOrDigit;
        base.RequireNonLetterOrDigit = false;
        var result = await base.ValidateAsync(password);

        if (!requireNonLetterOrDigit)
            return result;

        if (!Enumerable.All<char>((IEnumerable<char>)password, new Func<char, bool>(this.IsLetterOrDigit)))
            return result;

        // Build a new list of errors so that the custom 'PasswordRequireNonLetterOrDigit' could be added. 
        List<string> list = new List<string>();
        foreach (var error in result.Errors)
        {
            list.Add(error);
        }
        // Add our own message: (The default by MS is: 'Passwords must have at least one non letter or digit character.')
        list.Add("Passwords must have at least one character that is neither a letter or digit. (E.g. '£ $ % ^ _ etc.')");
        result = await Task.FromResult<IdentityResult>(IdentityResult.Failed(string.Join(" ", (IEnumerable<string>)list)));

        return result;
    }
}

【讨论】:

  • 一些解释会很有用
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 2021-08-25
  • 2020-08-31
  • 2016-11-12
  • 1970-01-01
  • 2023-02-04
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多