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

时间:2019-02-13 22:15:22

标签: c# asp.net-mvc asp.net-core asp.net-identity asp.net-core-2.1

我正在使用Identity(UserManager,RoleManager)开发一个asp.net core 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提供一种验证方法?

2 个答案:

答案 0 :(得分:1)

对于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中检查验证结果。

答案 1 :(得分:0)

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

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

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

还要感谢周涛的替代帮助