以编程方式生成符合Active Directory密码策略复杂性要求的随机密码

时间:2016-07-25 17:34:49

标签: c# asp.net regex active-directory directoryservices

我正在尝试使用忘记密码功能来设置密码。

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;
}

我需要生成符合以下复杂性的随机密码:

  • 不包含用户的帐户名称或用户的全名超过两个连续字符的部分
  • 长度至少为六个字符
  • 包含以下四个类别中的三个字符:
    • 英文大写字母(A到Z)
    • 英文小写字母(a到z)
    • 基数为10位(0到9)
    • 非字母字符(例如,!,$,#,%)

更改或创建密码时会强制执行复杂性要求。

是否有符合上述要求的内置方法?我使用下面的方法来生成randomely密码:

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

当我尝试设置密码时,它会抛出错误。感谢是否有验证或内置方法来实现上述要求。

2 个答案:

答案 0 :(得分:0)

我认为使用ActiveDirectoryMembershipProvider的ResetPassword()方法应该完全符合您的要求。 MSDN - ActiveDirectoryMembershipProvider - ResetPassword()

答案 1 :(得分: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;
    }
}