繁体   English   中英

忘记密码格式在asp.net MVC 4

[英]Forget password form in asp.net mvc 4

我尝试在asp.net mvc 4项目中实现忘记密码的形式,一切正常,但是当我尝试使用新密码登录系统时,它告诉我密码错误。

[HttpPost]
public ActionResult ForgetPassword(UserViewModel userModel) {
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var random = new Random();
    var result = new string(
        Enumerable.Repeat(chars, 8)
                  .Select(s => s[random.Next(s.Length)])
                  .ToArray());

    User user = _userRepo.GetUserByEmail(userModel.Email);
    if (user == null) {
        ViewBag.Error = Resources.Account.userEmailNotExist;
        return View(userModel);
    }

    String newHashedPassword = Crypto.HashPassword(result);
    user.Password = newHashedPassword;
    user.LastPasswordChangedDate = DateTime.UtcNow;
    _userRepo.SaveChanges();

    string enMessage = "Your new password: " + result;

    var httpCookie = Request.Cookies["lang"];
    if (httpCookie != null && httpCookie.Value == "en") {
        _mailHelper.SendEmail(userModel.Email, "New password", enMessage);
    }

    return RedirectToAction("ConfirmPasswordChange", "Account");
}

登录表单:

[HttpPost]
public ActionResult Login(UserViewModel user) {
    var users = _userRepo.GetAllEntitiesWithParam("JobsDb_Users_GetByEmail", user.Email).FirstOrDefault();
    ...
    try {
        var tryLogin = WebSecurity.Login(users.Username, user.Password, true);
        if (tryLogin == WebSecurity.MembershipLoginStatus.Failure)
        {
            var httpCookie = Request.Cookies["lang"];
            if (httpCookie != null && httpCookie.Value == "en") {
                ViewBag.Error = "Your password is incorrect.";
                new SeoHelper().ReturnSeoTags(this, "Login");
            }
            return View(user);
        }
        ...
    } catch {
        ...
    }
}

WebSecurity内部

public static MembershipLoginStatus Login(string username, string password, bool rememberMe) {
    if (Membership.ValidateUser(username, password)) {
        FormsAuthentication.SetAuthCookie(username, rememberMe);
        return MembershipLoginStatus.Success;
    } else {
        return MembershipLoginStatus.Failure;
    }
}

内部会员

public override bool ValidateUser(string username, string password) {
    if (string.IsNullOrEmpty(username)) {
        return false;
    }
    if (string.IsNullOrEmpty(password)) {
        return false;
    }
    User user = _userRepository.GetAll().FirstOrDefault(usr => usr.Username == username);
    if (user == null) {
        return false;
    }
    if (!user.IsApproved.Value) {
        return false;
    }
    if (user.IsLockedOut.Value) {
        return false;
    }
    String hashedPassword = user.Password;
    Boolean verificationSucceeded = (hashedPassword != null && Crypto.VerifyHashedPassword(hashedPassword, password));
    if (verificationSucceeded) { //here is I have false if try to login using password from forget form
        user.PasswordFailuresSinceLastSuccess = 0;
        user.LastLoginDate = DateTime.UtcNow;
        user.LastActivityDate = DateTime.UtcNow;
    } else {
        int failures = user.PasswordFailuresSinceLastSuccess.Value;
        if (failures < MaxInvalidPasswordAttempts) {
            user.PasswordFailuresSinceLastSuccess += 1;
            user.LastPasswordFailureDate = DateTime.UtcNow;
        } else if (failures >= MaxInvalidPasswordAttempts) {
            user.LastPasswordFailureDate = DateTime.UtcNow;
            user.LastLockoutDate = DateTime.UtcNow;
            user.IsLockedOut = true;
        }
    }
    _userRepository.SaveChanges();
    if (verificationSucceeded) {
        return true;
    }
    return false;
}

第一步是打开您的数据库,并确认新密码实际上已保留。 如果存在,最可能的原因是您的存储库正在使用陈旧(缓存)数据。

如果使用的是Entity Framework,则会发生这种情况,因为默认情况下,该框架将在创建DbContext时缓存数据库的状态,因此它将保留原始密码。 您可以通过使用原始密码登录来验证这一点。

我不确定,但是以下代码对我来说似乎不正确:

    User user = _userRepo.GetUserByEmail(userModel.Email);
    if (user == null) {
        ViewBag.Error = Resources.Account.userEmailNotExist;
        return View(userModel);
    }

    String newHashedPassword = Crypto.HashPassword(result);
    user.Password = newHashedPassword;
    user.LastPasswordChangedDate = DateTime.UtcNow;
    _userRepo.SaveChanges();

您从存储库中提取了用户,对内存中的用户对象进行了更改,然后在存储库上调用了SaveChanges()。 这在您的世界中有用吗? _userRepo.SaveChanges();如何_userRepo.SaveChanges(); 知道哪个对象已更改。 调用后,您是否在DB中看到正确的哈希值? 您在ValidateUser()方法中看到的密码值是什么? 在生成哈希密码和进行验证时,哈希算法是否一致?

我可能是错的,如果是的话,如果您对我上面所提的问题有更多的分析,那将是一件好事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM