【问题标题】:How to describe PasswordValidator rules如何描述 PasswordValidator 规则
【发布时间】:2015-12-14 17:53:12
【问题描述】:

Microsoft.AspNet.Identity.PasswordValidator 可配置多个参数,这些参数定义了最小密码长度和复杂性规则。如果用户输入的密码不符合标准,PasswordValidator 将抛出描述违规的异常,但它没有提供其他方式向用户描述规则(例如“密码必须是 8-12 个字符并且必须包含 . ..“ 等等)。

我搜索了 StackOverflow 和整个网络,发现肯定有数百个我需要的示例,但开始看起来我是唯一需要这个的人,我知道这不是案子。在我编写自己的实现之前,我只需要问...

我是否完全忽略了这个问题的公认“标准”答案?

【问题讨论】:

    标签: .net security passwords asp.net-identity


    【解决方案1】:

    这听起来可能有点骇人听闻,但将一个空字符串发送到 PasswordValidator 的 ValidateAsync() 方法就可以了。具有默认配置的 UserManager 示例:

    var rules = await UserManager.PasswordValidator.ValidateAsync("");
    
    rules.Errors.First() : 
    Passwords must be at least 6 characters. 
    Passwords must have at least one non letter or digit character. 
    Passwords must have at least one digit ('0'-'9'). 
    Passwords must have at least one lowercase ('a'-'z'). 
    Passwords must have at least one uppercase ('A'-'Z').
    

    你甚至可以列出它们

    var list = rules.Errors.First().Split('.'); 
    

    【讨论】:

    • 有趣,但我不确定我是否可以称其为结果段落中不寻常且有些不友好的措辞的答案。我正在尝试对您在大多数网站上看到的规则进行友好的解释。我犹豫要不要发布这个问题,假设一百个人都会告诉我“使用 Foo 类,每个人都知道这一点”,但看起来这个问题没有标准答案。大多数网站可能只是将解释直接写入页面源代码。
    • 呃。 “...由于不寻常...”您不讨厌在为时已晚编辑您的评论后发现语法错误吗?
    【解决方案2】:

    这是我想出的,因为我需要一些工作,但没有找到我正在寻找的标准答案。为了方便起见,我将它实现为对 PasswordValidator 类的扩展,尽管这不是绝对必要的。

    public static string ToDescription(this PasswordValidator validator)
    {
        var options = new List<string>();
        if (validator.RequireUppercase) options.Add("upper-case letters");
        if (validator.RequireLowercase) options.Add("lower-case letters");
        if (validator.RequireDigit) options.Add("numbers");
        if (validator.RequireNonLetterOrDigit) options.Add("special characters");
    
        var result = "Passwords must be at least " 
            + validator.RequiredLength + " characters long"
            + (options.Any() ? ", and include " + options.OxfordJoin() : ".");
    
        return result;
    }
    

    我还添加了 OxfordJoin 扩展,将需求列表转换为格式良好的句子:

    public static string OxfordJoin(this IEnumerable<string> source)
    {
        var array = source.ToArray();
        var joined = string.Join(", ", array);
        var result = (array.Length > 2)
            ? joined.ReplaceLast(",", ", and")
            : joined.ReplaceLast(",", " and");
    
        return result;
    }
    

    ...最后是“如此标准,它应该已经在框架中” ReplaceLast 实现:

    public static string ReplaceLast(this string value, string oldValue, string newValue)
    {
        var position = value.LastIndexOf(oldValue, StringComparison.InvariantCultureIgnoreCase);
        var result = (position > -1)
            ? value.Substring(0, position) + newValue + value.Substring(position + 1)
            : value;
    
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多