2016-07-25 54 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

我已经写了相同的逻辑,它似乎工作正常。感谢您的指导。 –