1

找出帐户未确认与密码无效的最佳方法是什么。

这是我的场景:

  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);
        }
      }

必须有一种方法可以做得更干净。有任何想法吗?

谢谢,

4

2 回答 2

1

您的检查方法非常接近。我已使用以下代码进行登录以检查确认。

    [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属性到查看模型。这在视图中用于确定是否显示一个按钮,该按钮允许用户将确认电子邮件重新发送给他们,以防他们丢失它。您可以在本文中阅读有关此方法的更多详细信息

于 2013-07-10T14:41:31.853 回答
0

我能想到的最简单的方法是Confirmation Token在他登录之前使用该帐户并激活该帐户。

或者,如果您想同时使用令牌和密码进行确认然后进行身份验证,我建议您获取密码,对其进行哈希处理,然后将其与数据库版本进行比较。在这个阶段,它将是一个直接的纯文本比较。如果token匹配userid并且hashed password也匹配database password,那么您可以进行身份​​验证。

如果您需要实际代码,请告诉我。

于 2013-07-10T09:34:51.440 回答