WebSecurity.ConfirmAccount(Id)始终为false

时间:2013-03-16 16:24:40

标签: c# asp.net-mvc-4 security simplemembership

我遇到了一个问题:我的网络安全总是在确认时丢失。我究竟做错了什么? 这是我的验证操作(我已调试它,收到的ID是正确的确认令牌:

    public ActionResult Validate(String Id)
    {
        if (String.IsNullOrEmpty(Id))
        {
            return View();
        }
        bool b = WebSecurity.ConfirmAccount(Id);
        if (b)
        {
            return View("ConfirmationSuccess");
        }
        return View("ConfirmationFailure");
    }

这是我的注册行动:

 public ActionResult Register(RegisterModel model, string ReturnUrl)
    {
        if (ModelState.IsValid)
        {
            // Попытка зарегистрировать пользователя
            try
            {
                string confirmationToken = WebSecurity.CreateUserAndAccount(model.rEmail.ToLower(), model.rPassword, null, true);
                dynamic email = new Email("~/Views/Emails/RegisterConfirmation.cshtml");
                email.To = model.rEmail;
                email.ConfirmationToken = confirmationToken;
                email.Send();
                return RedirectToAction("EmailValidation", new { Email = model.rEmail.ToLower() });
            }
            catch (MembershipCreateUserException e)
            {
                string field = string.Empty;
                switch (e.StatusCode)
                {
                    case MembershipCreateStatus.DuplicateUserName:
                        field = "rEmail";
                        break;
                    case MembershipCreateStatus.InvalidPassword:
                        field = "rPassword";
                        break;
                    default:
                        field = "RegisterForm";
                        break;
                }
                ModelState.AddModelError(field, ErrorCodeToString(e.StatusCode));
            }
        }
        ViewBag.RegisterModel = model;
        ViewBag.ReturnUrl = ReturnUrl;
        ViewBag.LoginModel = new LoginModel();
        //ModelState.AddModelError("rEmail", "Пользователь с таким e-mail уже зарегистрирован");
        // Появление этого сообщения означает наличие ошибки; повторное отображение формы
        return View("Login");
    }

注册后发送电子邮件,链接是正确的链接,但当它转到WebSecurity.ConfirmAccount(Id)时,它总是抛出错误....

感谢您的时间,对不起我的英语不好。

UPD: 在我的IIS服务器上有一个转换器可以降低所有URL。可能是这样,它比较了区分大小写的键吗?我该如何解决这个问题?

UPD: 好吧,问题实际上是小写网址。 WebSecurity.ConfirmAccount是区分大小写的......我在我的操作中做了一些解决方法,以便我可以获得正确的ConfitmtionToken,但这不是完全正确的方式,而我可能会有两个相同的ConfirmationToken.ToLower(),所以,请某人指出正确的方法。 这是我的解决方法:

public ActionResult Validate(String Id)
    {
        if (String.IsNullOrEmpty(Id))
        {
            return View();
        }
        //bool b = WebSecurity.ConfirmAccount(Id);
        using (var ctx = new DBContext())
        {
            Id = ctx.wpMembership.Where(s => s.ConfirmationToken.Equals(Id, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().ConfirmationToken;
        }

        if (WebSecurity.ConfirmAccount(Id))
        {
            return View("ConfirmationSuccess");
        }
        return View("ConfirmationFailure");
    }

1 个答案:

答案 0 :(得分:1)

这是因为您传递的帐户ID不是确认令牌。您需要传递确认令牌。

确认令牌由CreateAccount(String,String,Boolean),CreateUserAndAccount(String,String,Object,Boolean)和GeneratePasswordResetToken(String,Int32)方法生成。令牌通常作为电子邮件中的链接发送给用户,用户单击该链接以验证其身份。