Как мне реализовать «Забыли пароль» в ASP.NET MVC? - PullRequest
15 голосов
/ 22 августа 2009

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

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

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

Ответы [ 4 ]

10 голосов
/ 23 августа 2009

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

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

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

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, но я уверен, что этого достаточно, чтобы вы начали. :)

6 голосов
/ 17 января 2013

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

5 голосов
/ 15 февраля 2013

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

Вот код для вас

[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();
            }
        }
...