如何找到旧密码让用户更改它
How to find OldPassword to let the user change it
我正在 Intranet 上工作,我刚刚在用户的个人资料上添加了一个功能来更改他的密码。
正如您在以下控制器中看到的那样:
[HttpPost]
public ActionResult ChangePassword(Employee objToEdit, FormCollection form, LocalPasswordModel model) // Find how to obtain "OldPassword" from AccountModel
{
objToEdit.Login = User.Identity.Name;
string name = objToEdit.FirstName;
string pwd = form["NewPassword"];
string confirm = form["ConfirmPassword"];
if (_service.Edit_password(objToEdit, pwd, confirm)) // Checks if NewPassword and ConfirmPassword are the same, and does some syntax checking
{
bool changePasswordSucceeded;
try
{
changePasswordSucceeded = WebSecurity.ResetPassword(WebSecurity.GeneratePasswordResetToken(objToEdit.Login), pwd); // Seems to work
}
catch (Exception)
{
changePasswordSucceeded = false;
}
if (changePasswordSucceeded)
{
return RedirectToAction("Index", new { Message = CRAWebSiteMVC.Controllers.AccountController.ManageMessageId.ChangePasswordSuccess });
}
else
{
ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
}
return new RedirectResult(Url.Action("Index"));
}
return View();
}
至此,用户只需输入新密码和确认密码即可。我想添加 "Enter your current Password" 功能,但我 找不到检索用户当前密码的方法!
用户配置文件数据库不再包含密码列,如果有帮助,我会使用表单身份验证。
编辑:感谢您的帮助,为了解决我的问题,我只是用以下内容替换了 ResetPassword 行:
changePasswordSucceeded = WebSecurity.ChangePassword(objToEdit.Login, current, pwd);
如果失败,直接显示当前密码错误的错误信息
你不能!
这实际上是一项安全功能。您永远不应以纯文本形式存储密码。
好处是,您不需要自己进行比较:
相反,使用 ValidateUser
之类的东西让会员提供者验证提供的密码。在幕后,此方法将散列密码并将其与数据库中包含的散列版本进行比较。
编辑:
此外,请注意,由于您使用的是 WebSecurity
class,因此有一种方法 ChangePassword
可以接受当前密码。似乎该方法将检查当前密码是否与指定的 currentPassword
参数匹配。也许你应该使用这个而不是 ResetPassword
我正在 Intranet 上工作,我刚刚在用户的个人资料上添加了一个功能来更改他的密码。
正如您在以下控制器中看到的那样:
[HttpPost]
public ActionResult ChangePassword(Employee objToEdit, FormCollection form, LocalPasswordModel model) // Find how to obtain "OldPassword" from AccountModel
{
objToEdit.Login = User.Identity.Name;
string name = objToEdit.FirstName;
string pwd = form["NewPassword"];
string confirm = form["ConfirmPassword"];
if (_service.Edit_password(objToEdit, pwd, confirm)) // Checks if NewPassword and ConfirmPassword are the same, and does some syntax checking
{
bool changePasswordSucceeded;
try
{
changePasswordSucceeded = WebSecurity.ResetPassword(WebSecurity.GeneratePasswordResetToken(objToEdit.Login), pwd); // Seems to work
}
catch (Exception)
{
changePasswordSucceeded = false;
}
if (changePasswordSucceeded)
{
return RedirectToAction("Index", new { Message = CRAWebSiteMVC.Controllers.AccountController.ManageMessageId.ChangePasswordSuccess });
}
else
{
ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
}
return new RedirectResult(Url.Action("Index"));
}
return View();
}
至此,用户只需输入新密码和确认密码即可。我想添加 "Enter your current Password" 功能,但我 找不到检索用户当前密码的方法!
用户配置文件数据库不再包含密码列,如果有帮助,我会使用表单身份验证。
编辑:感谢您的帮助,为了解决我的问题,我只是用以下内容替换了 ResetPassword 行:
changePasswordSucceeded = WebSecurity.ChangePassword(objToEdit.Login, current, pwd);
如果失败,直接显示当前密码错误的错误信息
你不能!
这实际上是一项安全功能。您永远不应以纯文本形式存储密码。
好处是,您不需要自己进行比较:
相反,使用 ValidateUser
之类的东西让会员提供者验证提供的密码。在幕后,此方法将散列密码并将其与数据库中包含的散列版本进行比较。
编辑:
此外,请注意,由于您使用的是 WebSecurity
class,因此有一种方法 ChangePassword
可以接受当前密码。似乎该方法将检查当前密码是否与指定的 currentPassword
参数匹配。也许你应该使用这个而不是 ResetPassword