2015-09-17 81 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