web-dev-qa-db-ja.com

ASP.NET Identity、「強力な」パスワードが必要

おそらく、今朝のgooglinのスキルはそれほど優れていませんが、個々のユーザーアカウントを使用する新しいasp.net mvc5プロジェクトで(最小/最大長ではなく)異なるパスワード要件を設定する方法を見つけることができないようです。

[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }

私はまだどのパスワード要件を実行したいのかわかりませんが、おそらく最小長と小文字、大文字、数字の組み合わせが必要です。

どのようにこれを達成することができますか?

39
ledgeJumper

RegularExpressionAttribute をこの回答のルールと一緒に使用できます。

パスワードの強度を検証する正規表現

7
Andreas

App_Start\IdentityConfig.csでパスワード要件を設定できます

// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 4,
    RequireNonLetterOrDigit = false,
    RequireDigit = false,
    RequireLowercase = false,
    RequireUppercase = false,
};
109
Sergei Shvets

別のオプションは、IIdentityValidator<string>の実装を作成し、それをPasswordValidatorUserManagerプロパティに割り当てることです。メソッドにはValidateAsyncが1つしかありません。そこで、任意の種類のパスワード検証を定義できます。クライアント側の検証ですが、私はこれをやって来る人のための代替としてそこに置くと思っただけです。

例えば.

public class CustomPasswordValidator : IIdentityValidator<string>
{

    public int MinimumLength { get; private set; }
    public int MaximumLength { get; private set; }

    public CustomPasswordValidator(int minimumLength, int maximumLength)
    {
        this.MinimumLength = minimumLength;
        this.MaximumLength = maximumLength;
    }
    public Task<IdentityResult> ValidateAsync(string item)
    {
        if (!string.IsNullOrWhiteSpace(item) 
            && item.Trim().Length >= MinimumLength 
            && item.Trim().Length <= MaximumLength)
            return Task.FromResult(IdentityResult.Success);
        else return Task.FromResult(IdentityResult.Failed("Password did not meet requrements."));

    }
}
9
Excommunicated
/*Passwords must be at least min. 8 and max. 16 characters in length, 
minimum of 1 lower case letter [a-z] and 
a minimum of 1 upper case letter [A-Z] and
a minimum of 1 numeric character [0-9] and
a minimum of 1 special character: $ @ $ ! % * ? & + = # 
PASSWORD EXAMPLE : @Password1 
*/
pass = TextBoxPss1.Text;  

Regex regex = new Regex("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[[email protected]$!%*?&+=#]) [A-Za-z\\[email protected]$!%*?&+=#]{8,16}$");
    Match match = regex.Match(pass);

    if (match.Success)
    {TextBoxPss1.Text = "OK" }