0

我有一个问题:我的网络安全总是在确认时抛出错误。我究竟做错了什么?这是我的验证操作(我已经调试过了,收到的 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) 时,它总是抛出 false....

感谢您的宝贵时间,并为我糟糕的英语感到抱歉。

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

UPD:好的,问题出在小写 url 上。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");
    }
4

1 回答 1

1

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

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

于 2013-10-02T18:38:43.387 回答