【问题标题】:Get password from a user with UserManager使用 UserManager 从用户那里获取密码
【发布时间】:2015-07-29 05:30:09
【问题描述】:

我正在使用 MVC5 ASP.NET 创建一个网站。 我正在使用具有密码哈希、用户名、电子邮件、电子邮件确认等属性的身份框架 2.0 实现类。我正在使用 userManager.ChangePassword(user.Id, Oldpassword, Newpassword);,但我不知道如何从用户那里获取纯文本(字符串)的密码

    [HttpPost]
    public ActionResult ChangePassword(AspNetUsersViewModel userView)
    {

        UserManager<IdentityUser> userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>());

        var result = userManager.ChangePassword(_User.Id, "123456789", userView.Password);

        return RedirectToAction("Index", "ConfigUser");

    }

现在我已经硬编码了用户当前密码“123456789”来测试它是否有效,它确实有效。 我希望你们能提供帮助。

【问题讨论】:

  • “从用户那里获取纯文本密码”是什么意思?
  • @PaoloCosta 现在用户只有一个 PasswordHash 和一个 SecurityStamp 属性,而不是直接的 Password 属性(“123456789”)。我正在使用 Identity 2.0 中的 IdentityUser 实现。
  • 如果它是一个哈希,你就不能将它收回。这是为了安全而设计的
  • 这是可以理解的。但是如果用户想使用函数 userManger.ChangePassword(id, old password, new password); 更改他/她的密码,则需要知道用户的旧密码。
  • 不,它只是检查旧密码是否对哈希正确。与登录时检查密码的操作相同。

标签: c# asp.net-mvc asp.net-identity-2 usermanager


【解决方案1】:
  1. 在表单标签内的视图中添加密码输入

      <input type="password" id= "userNewPassword" name="userNewPassword">
    
  2. 在 userView 之后将 userNewPasswor 作为字符串传递给控制器​​,然后传递给 UserManager

      [HttpPost]
      public ActionResult ChangePassword(
                AspNetUsersViewModel userView,
                string userNewPassword){
    
                           UserManager<IdentityUser> userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>());
                           var result = userManager.ChangePassword(_User.Id, userNewPassword , userView.Password);
                           return RedirectToAction("Index", "ConfigUser");
    
    
                                     }
    

注意:最好的方法是修改 userView 并将 userNewPassword 添加到模型中

更新:

在 Visual Studio 2013 中,如果您使用 asp.net 默认模板,您会发现流动类

public class ChangePasswordBindingModel
{
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Current password")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm new password")]
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

【讨论】:

  • 我明白了你的想法——谢谢。但是如何检查“userNewPassword”是否等于用户当前密码?
  • 更改密码方法会自动检查旧密码通过参数表 1.userId, 2.currentPassword, 3.newPassword 你不必自己检查
  • 如果你想哈希密码使用 UserManager.PasswordHasher.HashPassword(PlainTextOldPassword) 它会给你哈希密码
猜你喜欢
  • 2021-10-17
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多