Лучший способ отличить неверный пароль от неподтвержденной учетной записи.

Каков наилучший способ выяснить, что учетная запись не была подтверждена, а не неверный пароль.

Вот сценарий, который у меня есть:

  1. Регистры пользователей
  2. Создан токен подтверждения и отправлено электронное письмо.
  3. Пользователь пытается войти.

На данный момент мы не знаем, вводит ли пользователь неверный пароль && еще не подтверждено.

У меня есть этот блок кода, но мне он кажется неправильным.

  {
      if (ModelState.IsValid)
      {
        if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
          return RedirectToLocal(returnUrl);
        }
        else if (WebSecurity.IsConfirmed(model.UserName) == false)
        {
          ModelState.AddModelError("", "The user account was not confirmed. Please check your email and try again");
          return View(model);
        }
      }

Должен быть способ сделать это чище. Любые идеи?

Спасибо,


person Sam    schedule 09.07.2013    source источник


Ответы (2)


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

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        string errorMsg = "The user name or password provided is incorrect.";

        if (model.IsConfirmed)
        {
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                return RedirectToLocal(returnUrl);
            }
            else if (WebSecurity.FoundUser(model.UserName) && !WebSecurity.IsConfirmed(model.UserName))
            {
                model.IsConfirmed = false;
                errorMsg = "You have not completed the registration process. To complete this process look for the email that provides instructions or press the button to resend the email.";
            }

        }
        else //Need to resend confirmation email
        {
            ResendConfirmationEmail(model.UserName);
            errorMsg = "The registration email has been resent. Find the email and follow the instructions to complete the registration process.";
            model.IsConfirmed = true;
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", errorMsg );
        return View(model);
    }

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

person Kevin Junghans    schedule 10.07.2013

Самый простой способ, который я могу придумать, это взять Confirmation Token и активировать учетную запись, используя его, прежде чем он сможет войти в систему.

В качестве альтернативы, если вы хотите использовать и токен, и пароль для подтверждения, а затем аутентификации, я предлагаю вам взять пароль, хешировать его и сравнить с версией базы данных. На данном этапе это будет прямое сравнение обычного текста. Если token соответствует userid, а hashed password также соответствует database password, вы можете пройти аутентификацию.

Дайте мне знать, если вам нужен фактический код для этого.

person RealSollyM    schedule 10.07.2013