2016-07-25 9 views
0

パスワードの機能を忘れるためにsetpasswordを使用しようとしています。私は、次の複雑さを満たすランダムなパスワードを生成する必要が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; 
} 

:2の連続した文字を超え

  • ユーザーのアカウント名またはユーザーのフルネームの一部が含まれていない
  • 少なくともう6文字の長さ
  • 以下の4つのカテゴリのうちの3つの文字が含まれています。
    • 英語の大文字の文字(ZスルーA)
    • 英語の小文字の文字(Zスルー)
    • ベース10個の数字(0〜9)
    • 非アルファベット文字(例えば、!、$、#、%)パスワードが変更または作成されたとき

複雑さの要件が適用されます。

上記の要件を満たすinbuiltメソッドはありますか?私はランダムにパスワードを生成する以下の方法を使用しました:

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

私はパスワードを設定しようとしているときにエラーをスローします。上記の要件を達成するための検証メソッドまたは組み込みメソッドがある場合はそれを感謝します。

+0

でそれを使用しているかを見ることができます。 – sln

+0

それぞれのカテゴリーからランダムに1〜3のアイテムを生成し、それらをランダムにミックスすることができます。その後、それらを検証正規表現に通して実行してください。 IMO、検証正規表現はより困難です。そして、6から9の長さでは解体不能であろう。 – sln

+0

これは、 'ユーザのアカウント名、または2つの連続する文字を超えるユーザのフルネームの部分を含んでいません.'では、別の正規表現またはプロセスが必要です。残りは1つの正規表現で検証することができます。 – 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

それはチェックしていませんユーザーのアカウント名または2つの連続した文字列の検証を超えるユーザーのフルネームの部分が含まれていません –

+0

確かにその論理を書くことができます – Eonasdan

+0

私は同じロジックを書いています。方向をありがとう。 –

0

ActiveDirectoryMembershipProviderのResetPassword()メソッドを使用すると、探しているものと正確に一致するはずです。 MSDN - ActiveDirectoryMembershipProvider - ResetPassword()

+1

そのページから 'ResetPasswordメソッドで作成されたランダムなパスワードは、PasswordStrengthRegularExpressionプロパティーの正規表現を渡すことは保証されていません。' – sln

関連する問題