Валидатор смены пароля .Net Core

Я очень новичок в .net Core, у меня есть форма, которая просит пользователя изменить свой пароль. И мне нужно проверить валидацию в бэкенде. Интерфейс в этом случае отправляет 3 параметра (UserID, Password, ConfirmedPWD). Что мне нужно в бэкэнде с точки зрения классов и контроллера?

Мое веб-приложение - это шаблон React Redux .Net Core 2.1.

Любая помощь приветствуется

Валидации:

  1. *Должен быть 1 Альфа

  2. *Должен быть 1 цифровой

  3. *Минимум 8, максимум 16

Класс CustomPasswordValidator:

public class CustomPasswordValidator


{
    public int RequiredLength { get; set; }
    public CustomPasswordValidator(int length)
    {

        RequiredLength = length;

    }

    public Task<IdentityResult> ValidateAsync(string item)

    {
        if (String.IsNullOrEmpty(item) || item.Length < RequiredLength)

        {
            List<string> errors = new List<string>() { "Password should be of length {0}" };
            return Task.FromResult(IdentityResult.Failed());

        }

        string pattern = @"^(?=.*[0-9])(?=.*[!@#$%^&*])[0-9a-zA-Z!@#$%^&*0-9]{10,}$";
        if (!Regex.IsMatch(item, pattern))

        {

            return Task.FromResult(IdentityResult.Failed());
        }

        return Task.FromResult(IdentityResult.Success);
    }
}

person Ayoub Salhi    schedule 24.07.2018    source источник


Ответы (2)


Я рекомендую библиотеку FluentValidation, где вы можете указать такие сложные сценарии декларативно.

Install-Package FluentValidation.AspNetCore

Класс вашего запроса.

public class ChangePasswordRequest
{
    public string UserId { get; set; }
    public string Password { get; set; }
    public string ConfirmedPWD { get; set; }
}

Вы можете создать свой собственный класс проверки с плавной проверкой. Вы также можете добавить свое сообщение об исключении.

public class ChangePasswordRequestValidator : AbstractValidator<ChangePasswordRequest>
{
    public ChangePasswordRequestValidator()
    {
        RuleFor(x => x.Password).Password();
    }
}

public static class RuleBuilderExtensions
{
    public static IRuleBuilder<T, string> Password<T>(this IRuleBuilder<T, string> ruleBuilder)
    {
        var options = ruleBuilder
                      .NotEmpty()
                      .NotNull()
                      .MinimumLength(8)
                      .MaximumLength(16)
                      .Matches("^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$").WithMessage("regex error");

        return options;
    }
}

Некоторые конфигурации...

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .AddFluentValidation(fvc =>
                fvc.RegisterValidatorsFromAssemblyContaining<Startup>());
}

Наконец, вы можете проверить свою модель с помощью ModelState.IsValid.

    [HttpPost]
    public async Task<IActionResult> ChangePassword([FromBody] ChangePasswordRequest request)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest();
        }

        return Ok();
    }
person Celal Yildirim    schedule 25.07.2018

Когда вы используете .net core, вам не нужно явно проверять ModelState, например

[HttpPost]
    public async Task<IActionResult> ChangePassword([FromBody] ChangePasswordRequest request)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest();
        }

        return Ok();
    }

Аннотация [ApiController] над контроллером автоматически выполнит проверку состояния модели. Прочтите его и используйте, если считаете его подходящим.

person abcbc    schedule 05.09.2019
comment
привет, какой атрибут вы используете для проверки пароля? - person Cedric Arnould; 27.03.2021
comment
Я думаю, что хорошим способом реализовать это было бы написать статический метод во вспомогательном классе, который проверяет пароль на соответствие требуемым проверкам, а затем вызывать этот метод проверки в какой-либо службе, а не непосредственно в контроллере. - person abcbc; 29.03.2021