2015-09-17 144 views
0

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

我搜索了StackOverflow和网络,一般认为那里必须有数百个例子,那里有我需要的东西,但它开始看起来像我是唯一需要这个的人,我知道它不是案子。在我写我自己的实现之前,我只需要问...

我完全忽略了对这个问题接受的“标准”答案吗?

回答

0

这就是我想出了,因为我需要得到的东西的工作,并没有发现罐头标准答案我正在寻找。为了方便起见,我将它作为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; 
} 
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('.'); 
+0

有趣,但我不确定我可以打电话给答案做的结果段落的不寻常的,有点不友好的措辞。我试图对大多数网站上看到的规则进行友好的解释。我很犹豫发布这个问题,假设有一百人会告诉我“使用Foo类,每个人都知道这个”,但是看起来这个问题没有标准答案。也许大多数网站可能只是将解释直接写入页面源代码。 – Mel

+0

呃。 “......由于不寻常的......”当你编辑你的评论为时已晚时,你发现语法错误时你不讨厌吗? – Mel