0

問題があります。私の Web セキュリティは、確認時に常に false をスローします。私は何を間違っていますか?これが私の検証アクションです(デバッグしました。受け取った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: OK、問題は実際には小文字の URL にあります。WebSecurity.ConfirmAccount は大文字と小文字が区別されます... 正しい ConfitmtionToken を取得できるように、アクションで少し回避策を講じましたが、これは完全に正しい方法ではありませんが、2 つの同一の 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 に答える