Использование библиотеки DataAnnotations

133
14 июня 2019, 08:00

Подскажите пожалуйста какой смысл от аннотации [DataType(DataType.Password)]? Вот например если я использую во вью хелпер @Html.Password Или просто напишу у хелпера textbox new { @type = "password" }, тогда у меняпри вводе в это поле символы будут отображаться звёзлочками для безопасности пароля. А вот попробовал в модели поставить аннотацию с типпом password на свойство. Нечего такого не происходит. Так для чего же нужна эта аннотация?

Answer 1

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

Валидация модели

Пример:

[Required]
[StringLength(18, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[RegularExpression(@"((?=.*[a-z]+)(?=.*[A-Z]+)(?=.*[0-9]+)(?=.*[!@#$%^&*()_+=\[{\]};:<>|./?,-]))")]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }

Password DataAnnotation

Data Annotation to validate confirm password

При использовании системы аутентификации и авторизации ASP.NET Identity мы можем столкнуться со следующей проблемой: при вводе пароля срабатывает встроенная логика валидации, и мы эту логику никак не можем изменить, используя стандартный механим атрибутов валидации. Но что, если нам надо установить другую минимальную длину пароля т.д. И несмотря на то, что встроенная логика валидации скрыта от наших глаз, мы ее можем переопределить. За механизм валидации отвечает свойство PasswordValidator класса UserManager. Оно хранит объект валидации, который мы можем изменить.

Если мы перейдем в файл IdentityConfig.cs в папке App_Start, то в определении класса ApplicationUserManager мы можем увидеть применение валидатора пароля:

var manager = new ApplicationUserManager
                (new UserStore<ApplicationUser>
                    (context.Get<ApplicationDbContext>()));
//..........................
manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = true,
    RequireDigit = true,
    RequireLowercase = true,
    RequireUppercase = true,
};

Для определения валидации пароля здесь применяется встроенный класс PasswordValidator, который имеет следующие свойства:

  • RequiredLength: минимальная длина пароля;
  • RequireNonLetterOrDigit: если равно true, то пароль должен будет иметь как минимум один символ, который не является алфавитно-цифровым;
  • RequireDigit: если равно true, то пароль должен будет иметь как минимум одну цифру;
  • RequireLowercase: если равно true, то пароль должен будет иметь как минимум один символ в нижнем регистре;
  • RequireUppercase: если равно true, то пароль должен будет иметь как минимум один символ в верхнем регистре.

Для большинства случаев данного функционала вполне хватит, мы можем настроить минимальную длину пароля, ввод алфавитных, цифровых или неалфавитно-цифровых символов. Однако если нам потребуется более сложая логика валидации, то придется определять свой класс валидатора.

Объект валидатора представляет объект интерфейса IIdentityValidator. В данном случае в качестве такого объекта используется экземпляр класса PasswordValidator, который устанавливает минимальную длину пароля и ряд других правил. Однако больше ничего с этим валидатором мы сделать не можем. Поэтому для создания более изощренной логики валидации нам надо создать отдельный класс.

Итак, создадим следующий класс:

public class CustomPasswordValidator : IIdentityValidator<String>
{
    public Int32 MinRequiredLength { get; private set; } // минимальная длина
    public CustomPasswordValidator(Int32 MinRequiredLength) =>
        this.MinRequiredLength = MinRequiredLength;
    public Task<IdentityResult> ValidateAsync(String item)
    {
        var hasLowerChar = new Regex(@"[a-z]+");
        var hasUpperChar = new Regex(@"[A-Z]+");
        var hasMiniMaxChars = new Regex($@".{MinRequiredLength, 15}");
        var hasNumber = new Regex(@"[0-9]+");
        var hasSymbols = new Regex(@"[!@#$%^&*()_+=\[{\]};:<>|./?,-]");
        if (String.IsNullOrWhiteSpace(item)) throw new Exception("Пароль не должен быть пустым");
        if (!Regex.IsMatch(item, hasLowerChar.ToString()))
        {
            return Task.FromResult(
                IdentityResult.Failed("Пароль должен содержать хотя бы одну строчную букву"));
        }
        else if (!Regex.IsMatch(item, hasUpperChar.ToString()))
        {
            return Task.FromResult(
                IdentityResult.Failed("Пароль должен содержать хотя бы одну заглавную букву"));
        }
        else if (!Regex.IsMatch(item, hasMiniMaxChars.ToString()))
        {
            return Task.FromResult(
                IdentityResult.Failed($"Пароль должен быть не менее {MinRequiredLength} символов"));
        }
        else if (!Regex.IsMatch(item, hasNumber.ToString()))
        {
            return Task.FromResult(
                IdentityResult.Failed("Пароль должен содержать хотя бы одно числовое значение"));
        }
        else if (!Regex.IsMatch(item, hasSymbols.ToString()))
        {
            return Task.FromResult(
                IdentityResult.Failed("Пароль должен содержать хотя бы один специальный символ"));
        }
        return Task.FromResult(IdentityResult.Success);
    }
}

Класс валидатора реализует интерфейс IIdentityValidator, который имеет один метод ValidateAsync. Этот метод принимает строковый параметр, на место которого затем в программе будет передаваться строка валидируемого пароля. Он умеет производит следующии проверки:

  • Проверка пароля на пустоту;
  • Проверка на содержание строчных букв;
  • Проверка на содержание заглавных букв;
  • Проверка на мин./макс. количество символов;
  • Проверка на содержание цифр;
  • Проверка на содержание спец. символов.

И затем также в определении класса ApplicationUserManager мы можем его использовать:

var manager = new ApplicationUserManager
                (new UserStore<ApplicationUser>
                    (context.Get<ApplicationDbContext>()));
//..............................
manager.PasswordValidator = new CustomPasswordValidator(5);
Answer 2

Для того что бы поле помеченное аннотацией [DataType(DataType.Password)] как пароль и при вводе в это поле значения помечались звёздочками как и должно быть в пароли нужно использовать хелпер EditorFor более подробный ответ в теме по ссылке: https://stackoverflow.com/questions/6044922/model-does-not-apply-datatype-password

READ ALSO
Перенос Верхнего меню в PHP

Перенос Верхнего меню в PHP

Надо вывести "Меню" <li> в код через PHPСмысл в том, чтобы не повторять одну и тоже строку <li>, а сократить 8 строк в 1 php вывод

131
Отправка документа на стену docs.save vk api

Отправка документа на стену docs.save vk api

При выполнении данного кода возникает ошибка в последней строке

164
Twig цикл в ассоциированном массиве

Twig цикл в ассоциированном массиве

У меня есть массив такого вида:

132