2016-07-25 98 views
0

我正在嘗試設置忘記密碼功能的密碼。以編程方式生成滿足Active Directory密碼策略複雜性要求的隨機密碼

public string SetPassWord(string userName, string randomPassword) 
{ 
    string result = string.Empty; 
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); 
    AdUser adUser = new AdUser(); 
    if (user != null) 
    { 
     user.SetPassword(randomPassword); 
     result = "Success"; 
    } 
    return result; 
} 

我需要生成符合下列複雜的隨機密碼:

  • 不包含超過兩個連續的字符
  • 是該用戶的帳戶名或用戶全名的部分至少長度爲6個字符
  • 包含以下四種類別中的三種字符:
    • 個英文大寫字母(A至Z)
    • 英文小寫字符(a到z)
    • 10個基本數字(0〜9)
    • 非字母字符(例如,!,$,#,%)當密碼被更改或創建

複雜性要求執行。

有沒有符合上述要求的內置方法?我用下面的方法隨機生成密碼:

string randomPassword = Membership.GeneratePassword(8, 0).Replace('<','!').Replace('>', '#'); 

它會引發錯誤,當我試圖設置密碼。欣賞是否存在驗證或內置方法來達到上述要求。

+0

我不能幫你在產生一部分,但我可以給你一個正則表達式來驗證它。 – sln

+0

您可以隨時從每個類別隨機生成1-3個項目,然後隨機混合起來。然後通過驗證正則表達式運行它們以確保。海事組織,驗證正則表達式更困難。而長度爲6到9將是不可破解的。 – sln

+0

這不包含超過兩個連續字符的用戶的帳戶名稱或部分用戶的全名需要一個單獨的正則表達式或過程。其餘的可以用一個正則表達式進行驗證。 – sln

回答

0

看看這樣的事情是否適合你。我原本是爲.Net Identity 2編寫的,但它應該指向正確的方向。你可以看到我是如何使用它GitHub

var validator = new PasswordValidator 
{ 
    RequiredLength = 6, 
    RequireNonLetterOrDigit = false, 
    RequireDigit = true, 
    RequireLowercase = true, 
    RequireUppercase = true 
}; 

passwords.Add(GeneratePassword(validator)); 


private static string GeneratePassword(PasswordValidator passwordValidator) 
{ 
    var rnd = new Random(); 

    while (true) 
    { 
     var password = Membership.GeneratePassword(passwordValidator.RequiredLength, 0); 
     if ((passwordValidator.RequireDigit && !password.Any(char.IsDigit)) || (passwordValidator.RequireLowercase && !password.Any(char.IsLower)) || (passwordValidator.RequireUppercase && !password.Any(char.IsUpper))) 
      continue; 

     if (!passwordValidator.RequireNonLetterOrDigit) password = Regex.Replace(password, @"[^a-zA-Z0-9]", m => rnd.Next(0, 10).ToString()); 
     return password; 
    } 
} 
+0

它不檢查不包含用戶的帳戶名稱或部分用戶的全名超過兩個連續的字符驗證 –

+0

當然,你可以編寫該邏輯 – Eonasdan

+0

我已經寫了相同的邏輯,它似乎工作正常。感謝您的指導。 –