#眉標=Enterprise Library #副標=設計模型套件系列(14) #大標=簡單建立密碼驗証原則 #作者=文/圖 王寧疆 ===<反灰>============= using System.Configuration; public class StrongPasswordValidatorData : Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.ValueValidatorData { public StrongPasswordValidatorData() { } public StrongPasswordValidatorData(string name) : base(name, typeof(StrongPasswordValidatorData)) { } protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator( Type targetType) { return new StrongPasswordValidator(MinLength, MinUpperCase, MinLowerCase, MinNumbers, MinSymbols); //建立負責驗証資料的Validator } private const string MinLengthPropertyName = "minLength"; //存放minLength屬性內容值的變數 [ConfigurationProperty(MinLengthPropertyName)] //定義名稱為minLength的屬性 public int MinLength { get { return (int)this[MinLengthPropertyName]; } set { this[MinLengthPropertyName] = value; } } private const string minUpperCasePropertyName="minUpperCase";//存放minUpperCase屬性內容值的變數 [ConfigurationProperty(minUpperCasePropertyName)] //定義名稱為minUpperCase的屬性 public int MinUpperCase { get { return (int)this[minUpperCasePropertyName]; } set { this[minUpperCasePropertyName] = value; } } private const string MinLowerCasePropertyName="minLowerCase";//存放minLowerCase屬性內容值的變數 [ConfigurationProperty(MinLowerCasePropertyName)] //定義名稱為minLowerCase的屬性 public int MinLowerCase { get { return (int)this[MinLowerCasePropertyName]; } set { this[MinLowerCasePropertyName] = value; } } private const string MinNumbersPropertyName = "minNumbers"; //存放minNumbers屬性內容值的變數 [ConfigurationProperty(MinNumbersPropertyName)] //定義名稱為minNumbers的屬性 public int MinNumbers { get { return (int)this[MinNumbersPropertyName]; } set { this[MinNumbersPropertyName] = value; } } private const string MinSymbolsPropertyName = "minSymbols"; //存放minSymbols屬性內容值的變數 [ConfigurationProperty(MinSymbolsPropertyName)] //定義名稱為minSymbols的屬性 public int MinSymbols { get { return (int)this[MinSymbolsPropertyName]; } set { this[MinSymbolsPropertyName] = value; } } ================ ===<反灰>============= [ConfigurationElementType(typeof(CustomValidator.Configuration.StrongPasswordValidatorData))] public class StrongPasswordValidator : Microsoft.Practices.EnterpriseLibrary.Validation.Validators.ValueValidator ================ ===<反灰>============= private int minLength; private int minLowerCase; private int minUpperCase; private int minNumbers; private int minSymbols; ================ ===<反灰>============= private static char[] upperLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); private static char[] lowerLetters = "abcdefghijklmnopqrstuvwxyz".ToCharArray(); private static char[] numbers = "1234567890".ToCharArray(); private static char[] symbols = @"`~!@#$%^&*()-_=+[]\{}|;:'"",./<>?".ToCharArray(); ================ ===<反灰>============= public StrongPasswordValidator(int minLength, int minUpperCase, int minLowerCase, int minNumbers, int minSymbols) : base(null, null, false) { this.minLength = minLength; this.minLowerCase = minLowerCase; this.minUpperCase = minUpperCase; this.minNumbers = minNumbers; this.minSymbols = minSymbols; } ================ ===<反灰>============= protected override string DefaultNonNegatedMessageTemplate //定義正向驗証失敗顯示的錯誤訊息的樣版 { get { return "密碼的長度必須至少{3}個字元, 內含{4}個大寫字母, {5}個小寫字母, {6}個阿拉伯數字, " + "以及{7}個特殊字元."; } } protected override string DefaultNegatedMessageTemplate //定義反向驗証失敗顯示的錯誤訊息的樣版 { get { return "密碼的長度不可以至少{3}個字元, 內含{4}個大寫字母, {5}個小寫字母, " + "{6}個阿拉伯數字, 以及{7}個特殊字元."; } } protected override void DoValidate(string objectToValidate, object currentTarget, string key, Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResults validationResults) //執行驗証工作的方法 { bool valid = true; if (objectToValidate.Length < minLength) //被驗証的字串的長度是否過短 { valid = false; } else if (CountOccurrences(objectToValidate, upperLetters) < minUpperCase) //被驗証的字串的大寫字母數目是否足夠 { valid = false; } else if (CountOccurrences(objectToValidate, lowerLetters) < minLowerCase) //被驗証的字串的小寫字母數目是否足夠 { valid = false; } else if (CountOccurrences(objectToValidate, numbers) < minNumbers) //被驗証的字串的阿拉伯數字的數目是否足夠 { valid = false; } else if (CountOccurrences(objectToValidate, symbols) < minSymbols) //被驗証的字串的特殊字元數目是否足夠 { valid = false; } if (valid == Negated) //記錄驗証失敗的結果 { this.LogValidationResult(validationResults, GetMessage(objectToValidate, key), currentTarget, key); } } protected override string GetMessage(object objectToValidate, string key) //傳回驗証結果訊息 {   return string.Format(System.Globalization.CultureInfo.CurrentUICulture, this.MessageTemplate, objectToValidate, key, this.Tag, minLength, minUpperCase, minLowerCase, minNumbers, minSymbols); } ================ ============= if (Regex.IsMatch("使用者輸入的密碼", @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\-\+\?\*\$\[\]\^\.\(\)\|`~!@#%&_ ={}:;',/]).{8,16}$")) { MessageBox.Show("正確!"); } else { MessageBox.Show("錯誤!"); } 最後請為所製作的Provider類別加入以下負責計算密碼內含指定字元的數目的方法: private int CountOccurrences(string input, char[] searchChars) { int count = -1; //記錄字元出現次數的變數 int position = -1; //記錄字元出現位置的變數 do { position = input.IndexOfAny(searchChars, position + 1); //搜尋字串中的指定字元 count++; //遞增指定字元的出現次數 } while (position >= 0); //如果所尋找的字元有尋獲,則必須再找下一個 return count; //傳回指定字元的出現次數 } ===<反灰>============= ===<反灰>============= using Microsoft.Practices.EnterpriseLibrary.Validation; ================ ===<反灰>============= ValidationResults results = Validation.Validate( txtPassword.Text, "Password"); //呼叫Validation類別的Validate方法驗証使用者輸入的資//料是否合乎名稱為Password的RuleSet設定的規則 if (results.IsValid) //如果通過驗証 { MessageBox.Show("安全性極佳的密碼!"); //顯示密碼安全性極佳的訊息 } else //如果未通過驗証 { StringBuilder sb = new StringBuilder(); //建立StringBuilder類別的物件 foreach (ValidationResult result in results) //取出results集合中的所有訊息 { sb.Append(result.Message); //串連到StringBuilder類別的物件中 } MessageBox.Show(sb.ToString()); //顯示密碼未符合規定的錯誤訊息 } ================ ===<反灰>============= CustomValidator.StrongPasswordValidator, StrongPasswordValidator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ================ ===<反灰>============= ================