区分无效密码和未确认帐户的最佳方法。

时间:2013-07-09 20:07:32

标签: asp.net-membership simplemembership

找出帐户的最佳方式是未确认,而密码无效。

以下是我的情景:

  1. 用户注册
  2. 创建确认令牌并发送电子邮件。
  3. 用户尝试登录。
  4. 此时,我们不知道该用户是否输入了无效密码&&尚未确认。

    我有这段代码,但对我来说似乎不对。

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

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

    谢谢,

2 个答案:

答案 0 :(得分: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 属性。这在视图中用于确定是否显示了一个按钮,允许用户在丢失确认电子邮件时重新发送确认电子邮件。你可以read more details about this approach in this article

答案 1 :(得分:0)

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

或者,如果您要同时使用令牌和密码进行身份验证,我建议您获取密码,哈希,将其与数据库版本进行比较。在这个阶段,它将是一个直接的纯文本比较。如果tokenuserid匹配且hashed password也与database password匹配,则您可以进行身份​​验证。

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