【问题标题】:.Net Core Change Password Validator.Net Core 更改密码验证器
【发布时间】:2018-07-24 14:50:36
【问题描述】:

我是 .net Core 的新手,我有一个要求用户更改密码的表单。我需要检查后端的验证。在这种情况下,前端发送 3 个参数(UserID、Password、ConfirmedPWD)。 就类和控制器而言,我在后端需要什么?

我的网络应用程序是 .Net Core 2.1 reactredux 模板。

感谢任何帮助

验证:

  1. *必须有 1 个 Alpha

  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);
    }
}

【问题讨论】:

    标签: validation .net-core react-redux asp.net-identity change-password


    【解决方案1】:

    我推荐 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();
        }
    

    【讨论】:

      【解决方案2】:

      当您使用 .net core 时,您不必像这样显式检查 ModelState

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

      控制器上的 [ApiController] 注释将自动为您进行模型状态验证。如果您觉得合适,请阅读并使用它。

      【讨论】:

      • 您好,您用来验证密码的属性是什么?
      • 我认为实现这一点的一个好方法是在帮助程序类中编写一个静态方法,根据您希望的检查验证密码,然后在某些服务中调用此验证方法,而不是直接调用在控制器中。
      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2023-03-31
      • 2011-09-24
      • 2020-03-26
      • 1970-01-01
      相关资源
      最近更新 更多