Как мне реализовать "Забыли пароль" в ASP.NET MVC?

Я использую стандартный SqlMembershipProvider, который поставляется с демо-версией ASP.NET MVC.

Я заинтересован в реализации ссылки "Забыли пароль" на моем сайте.

Каков правильный способ реализации этой функции? Должен ли я перезаписать пароль временным и отправить его по электронной почте на свой зарегистрированный адрес электронной почты?

Ответы

Ответ 1

Основываясь на характере приложения, Лучшая практика для забытого пароля должна быть в следующем порядке

  • Разрешить пользователю проверять Секрет/Вопрос максимум на 3-5 попыток
  • При успешной проверке отправьте электронное письмо с случайным сгенерированным паролем со сроком действия 24 часа.
  • Электронная почта должна содержать только пароль, но не имя пользователя и пароль.
  • Когда пользователь входит в систему с временным паролем, перед переходом на домашнюю страницу пользователь должен быть вынужден создать новый пароль.

Ответ 2

Поставщик автоматически выполнит reset для вас:

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.resetpassword.aspx

Образец просто возвращает новый пароль в браузер вместо отправки по электронной почте пользователю, но использует секретный вопрос/ответ, который можно настроить с помощью провайдера.

Этот образец получает пароль и отправляет его по электронной почте:

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.getpassword.aspx

Я думаю, что любой подход безопасен. По электронной почте это шаг немного безопаснее, так как пользователю нужно будет узнать вопрос/ответ и пароль по электронной почте, чтобы взломать учетную запись.

Я понимаю, что эти образцы не используют MVC, но я уверен, что этого достаточно, чтобы вы начали.:)

Ответ 3

По правде говоря, лучше направить пользователю ссылку с каким-то невозможным угадать URL (скажем, с помощью случайного Guid. Когда пользователь нажимает на URL-адрес, он может reset пароль. URL-адрес должен быть полезен для один используется только и должен истекать через заданное время.

Ответ 4

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

Вот вам какой-то код

[HttpPost]
[AllowAnonymous]
public ActionResult ForgotPassword(ForgotPasswordModel model)
    {
      .
      .
      .  
      .
                if (WebSecurity.UserExists(model.UserName))
                {
               var token = WebSecurity.GeneratePasswordResetToken(model.UserName, 60);
                  .
                  .
                  .
                  .                        
                    // send this token by email
                }
                else
                {
                    ModelState.AddModelError("", "Could not find User");
                }
            }
      return View(model);


    }

 [HttpPost]
     public ActionResult ResetPassword( ResetPasswordModel model)
    {
        string token = Request.Params["token"];
        if (!string.IsNullOrEmpty(token))
        {
            if (WebSecurity.ResetPassword(token, model.NewPassword))
            {
        // send email…….. or                                          
                return View();
            }
        }