Подтвердить что ты не робот

Сменить пароль в MVC 4

Я создаю приложение ASP.NET MVC 4. Я использую Simple Membership provider для управления аутентификацией и авторизацией в системе. Каковы способы изменения пароля в этом подходе. Я нашел метод ChangePassword, который использует три параметра, включая исходный пароль, для работы.

Есть ли другой способ переопределить/изменить пароль для пользователя без фактического знания исходного пароля?

4b9b3361

Ответ 1

ChangePassword используется, когда пользователь хочет изменить свой пароль - и текущий пароль является их доказательством, позволяющим это произойти (подумайте об изменении пароля).

Я думаю, что самый прямой способ сделать это - вызвать WebSecurity.GeneratePasswordResetToken() и передать результат в WebSecurity.ResetPassword вместе с новым паролем.

  var token = WebSecurity.GeneratePasswordResetToken("UserName");
  var result = WebSecurity.ResetPassword(token, "NewPassword");

Ответ 2

Существует подробная статья о о том, как реализовать пароль reset/изменить с помощью SimpleMembership в MVC 4 здесь. Он также включает исходный код, который вы можете скачать.

В этих примерах используется электронная почта для отправки URL-адреса пользователю, чтобы щелкнуть по паролю reset. Это более безопасно, чем просто ввод пользователем старого пароля и нового пароля непосредственно на веб-сайт, поскольку это еще одна проверка пользователя. Это облегчает сценарий, когда кто-то получает пароль пользователя и блокирует их, изменяя пароль. Это также позволяет пользователю reset пароль в случае, если они забыли пароль.

Код для отправки электронной почты со ссылкой будет выглядеть примерно так.

[AllowAnonymous]
[HttpPost]
public ActionResult ResetPassword(ResetPasswordModel model)
{
    string emailAddress = WebSecurity.GetEmail(model.UserName);
    if (!string.IsNullOrEmpty(emailAddress))
    {
        string confirmationToken =
            WebSecurity.GeneratePasswordResetToken(model.UserName);
        dynamic email = new Email("ChngPasswordEmail");
        email.To = emailAddress;
        email.UserName = model.UserName;
        email.ConfirmationToken = confirmationToken;
        email.Send();

       return RedirectToAction("ResetPwStepTwo");
    }

    return RedirectToAction("InvalidUserName");
}

Это создает электронное письмо, в котором есть ссылка на веб-API, который принимает токен в качестве идентификатора, который передается. Когда они нажимают на ссылку, она обращается к этому методу.

[AllowAnonymous]
public ActionResult ResetPasswordConfirmation(string Id)
{
    ResetPasswordConfirmModel model = new ResetPasswordConfirmModel() { Token = Id };
    return View(model);
}

Это действие получает токен из строки запроса и помещает его в ResetPasswordConfirmationModel, который передается в представление, которое позволяет пользователю вводить новый пароль. Новый пароль вводится дважды, чтобы убедиться, что они правильно ввели его, что подтверждается на странице. Когда они отправляют эту информацию, они переносятся в версию POST этого действия, которая фактически сбрасывает пароль.

[AllowAnonymous]
[HttpPost]
public ActionResult ResetPasswordConfirmation(ResetPasswordConfirmModel model)
{
    if (WebSecurity.ResetPassword(model.Token, model.NewPassword))
    {
        return RedirectToAction("PasswordResetSuccess");
    }
    return RedirectToAction("PasswordResetFailure");
}