0

SimpleMemberShip で ASP.net MVC4 を使用しています。

私を覚えているチェックボックスがチェックされている場合は、ユーザー名を保存し、Cookieからリロードしたいだけです。

ログインは正常に機能し、RememberMe は true に設定されています。ただし、Request.Cookies[FormsAuthentication.FormsCookieName] は常に null です。これがどのように機能するのか混乱しています。

ログイン コントローラ:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Index(LoginModel model, string returnUrl)
    {
        bool RememberMe = model.RememberMe == "on" ? true : false;
        if (WebSecurity.Login(model.UserName, model.Password, persistCookie: RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

ログインページコントローラー:

    [AllowAnonymous]
    public ActionResult Index(string returnUrl)
    {
        // load user name
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];


        if (authCookie != null)
        {
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
            ViewBag.Username = Server.HtmlEncode(ticket.Name);
            ViewBag.RememberMeSet = true;
        }
        else
        {
            ViewBag.RememberMeSet = false;
        }
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }
4

1 に答える 1

1

「Remember me」チェックボックスをクリックしてユーザー名を保存したかったのです。ログインしない限りCookieがnullであることを理解したので、ログインページでは役に立ちませんでした。参考までに、私のソリューションを以下に追加しました。

ログイン要求コントローラーの処理:

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Index(LoginModel model, string returnUrl)
        {
            // handle remembering username on login page
            bool RememberMe = model.RememberMe == "on" ? true : false;
            HttpCookie existingCookie = Request.Cookies["xxx_username"];

            if (RememberMe)
            {
                // check if cookie exists and if yes update
                if (existingCookie != null)
                {
                    // force to expire it
                    existingCookie.Expires = DateTime.Today.AddMonths(12);
                }
                else
                {
                    // create a cookie
                    HttpCookie newCookie = new HttpCookie("xxx_username", model.UserName);
                    newCookie.Expires = DateTime.Today.AddMonths(12);
                    Response.Cookies.Add(newCookie);
                }
            }
            else
            {
                // remove cookie
                if (existingCookie != null)
                {
                    Response.Cookies["xxx_username"].Expires = DateTime.Now.AddDays(-1);
                }
            }

            if ((!string.IsNullOrEmpty(model.UserName)) && (!string.IsNullOrEmpty(model.Password)))
            {
                if (WebSecurity.Login(model.UserName, model.Password, RememberMe))
                {
                    return RedirectToLocal(returnUrl);
                }
            }

            // If we got this far, something failed, redisplay form
            TempData["ErrorMsg"] = "Login failed";
            return View(model);
        }

ログインページの表示コントローラー:

    [AllowAnonymous]
    public ActionResult Index(string returnUrl)
    {
        // load user name
        HttpCookie existingCookie = Request.Cookies["xxx_username"];
        if (existingCookie != null)
        {
            ViewBag.Username = existingCookie.Value;
            ViewBag.RememberMeSet = true;
        }
        else
        {
            ViewBag.RememberMeSet = false;
        }
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }
于 2014-11-10T18:55:37.773 に答える