更改密码时如何重用身份密码验证

How to reuse identity password validation when changing passwords

我正在使用身份(UserManager、RoleManager)开发一个asp.net核心2.1项目,其密码设置为:

services.Configure<IdentityOptions>(options =>
    {
        options.Lockout.AllowedForNewUsers = false;
        options.Lockout.MaxFailedAccessAttempts = 3;
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;
        options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    });

我正在开发自己的更改密码功能,但我想知道是否有办法利用以前的密码设置(之前提到的启动设置)来验证新密码(例如:通过注入服务) ,避免创建新的密码验证器或者 UserManager 提供了一种验证方法?

对于IPasswordValidator,由

注册
services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();

要访问 PasswordValidator<TUser>,您可以尝试

public class HomeController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IPasswordValidator<IdentityUser> _passwordValidator;
    public HomeController(UserManager<IdentityUser> userManager
        , IPasswordValidator<IdentityUser> passwordValidator)
    {
        _userManager = userManager;
        _passwordValidator = passwordValidator;
    }

然后通过

验证密码
public IActionResult Index()
{
    var result = _passwordValidator.ValidateAsync(_userManager, null, "123");

    return View();
}

对于PasswordValidator,它没有验证用户,所以你可以传递null。

检查 var result 中的验证结果。

我通过使用 UserManager 的 ChangePasswordAsync 方法找到了解决方案,它检查密码验证策略:

var result = await _userManager.ChangePasswordAsync(usuario, model.ContraseñaActual, model.ContraseñaNueva);

之后,检查布尔值 属性 result.Succeeded 和 result.Errors 集合,我可以根据验证策略验证消息错误。

同时感谢陶周的替代帮助