Идентификация ASP.NET, требуются «надежные» пароли

Возможно, сегодня утром мои навыки гугления не так хороши, но я не могу найти, как настроить различные требования к паролю (а не минимальную/максимальную длину) с новым проектом 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; }

Я пока не знаю, какие требования к паролю я хочу сделать, но, вероятно, это комбинация минимальной длины и требования одной строчной буквы, заглавной буквы и цифры.

Любая идея, как я могу это сделать (предпочтительно с помощью атрибутов модели)?


person ledgeJumper    schedule 06.01.2014    source источник
comment
Будете ли вы использовать MembershipProvider? Используя его, вы можете установить свойство PasswordStrengthRegularExpression, чтобы определить правила надежности вашего пароля - msdn.microsoft.com/en-us/library/   -  person giacomelli    schedule 06.01.2014
comment
@giacomelli Я использую нового поставщика удостоверений. Если я не ошибаюсь, я не верю, что это сработает. У меня нет записи о членстве в моем web.config   -  person ledgeJumper    schedule 06.01.2014
comment
Хорошо подумайте, как это сделать. Я использую набор паролей, и это очень раздражает, когда тот, который я хочу, запрещен сайтом, потому что он не соответствует их правилам, хотя на самом деле это надежный пароль. Теперь у меня есть записанный список паролей, а это не то, что люди искали, я надеюсь...   -  person simon at rcl    schedule 06.01.2014
comment
@simonatrcl Я полностью согласен. Я пытаюсь понять, как это сделать, но для приложения я попытаюсь убедить своего клиента не устанавливать ограничения, кроме минимальных символов. Я ненавижу сайты, которые заставляют меня использовать странные пароли, которые не входят в мой обычный список. (смотря на вас, различные компании кредитных карт)   -  person ledgeJumper    schedule 06.01.2014
comment
:) Покажите им это: xkcd.com/936 - это правда!   -  person simon at rcl    schedule 06.01.2014
comment
Уже сделал! Она кажется довольно умной, поэтому я думаю, что смогу избежать таких паролей, как Tr0ub4dor&3.   -  person ledgeJumper    schedule 06.01.2014


Ответы (3)


Вы можете использовать RegularExpressionAttribute вместе с правилами из этого ответа:

Регулярное выражение для проверки надежности пароля

person Andreas    schedule 06.01.2014

Вы можете настроить требования к паролю в App_Start\IdentityConfig.cs

// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 4,
    RequireNonLetterOrDigit = false,
    RequireDigit = false,
    RequireLowercase = false,
    RequireUppercase = false,
};
person Sergei Shvets    schedule 31.07.2014
comment
Я изменил код, как вы упомянули, для public static ApplicationUserManager Create(...) в App_Start\IdentityConfig.cs только для того, чтобы найти (действительно) позже этот Q и реализовать параметр StringLength для свойства Password Identity.Models.RegisterViewModel перекрывается с RequiredLength, упомянутым выше, поэтому, если Я меняю настройку в обоих местах, это не влияет. Я бы застрял, если бы это было из-за комбинации этого вопроса и твоего ответа. - person DavideB; 23.09.2014
comment
Где бы вы настроили это в проекте WebForms? - person TrevorBrooks; 28.01.2016
comment
Да! Это должен быть принятый ответ. В WebForms вы найдете этот код в публичном статическом ApplicationUserManager Create (...) - person Ignacio; 05.05.2016
comment
одна маленькая проблема. вы не можете добавить аннотацию данных в UserViewModel для обеспечения соблюдения правил пароля. Почему нет аннотации данных как PasswordValidator для размещения в UserViewModel? - person akd; 30.06.2017

Другой вариант — создать реализацию IIdentityValidator<string> и назначить ее свойству PasswordValidator вашего UserManager. У него есть только один метод, ValidateAsync, и вы можете определить там любую проверку пароля, которая вам нравится. Я знаю, что это не имеет тех же преимуществ, что и использование атрибутов в вашем классе модели, что касается автоматической проверки на стороне клиента, но просто подумал, что выложу это в качестве альтернативы для всех, кто придет.

e.g.

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."));

    }
}
person Excommunicated    schedule 06.01.2014