在ASP.NET MVC身份验证中,“记住我”功能无法正常工作

16

我有一个标准的 ASP.NET MVC (RC Refresh) 网站项目,其中包含标准的 ASP.NET 成员资格提供程序和项目模板中包括的帐户控制器。

当我在登录表单中选择“记住我”之后,网站仍未记住我。(Firefox 记住了我的用户名和密码,但我期望自动登录)

我需要手动设置并检查 cookie 吗?如果是,请问应该如何最好地完成这个过程?

3个回答

17

您需要将 true/false 传递给 SetAuthCookie 方法。

public ActionResult Login (string email, string password, bool rememberMe, string returnUrl)  
{

    // snip

    FormsAuth.SetAuthCookie(username, rememberMe); // <- true/false

    // snip
}

并确保bool rememberMe反映了登录页面复选框的状态。


1
我做到了这一点,立即生效,当我登录、关闭浏览器、重新打开并浏览该网站时,我会立即再次登录——即使我不想查看需要登录的页面。这是应该这样吗,还是我让它变得太容易了? - Tomas Aschan
1
SetAuthCookie的createPersistentCookie参数会在用户系统上保存一个cookie,使其保持登录状态。所以是的,这就是该参数的作用。还有两个控制登录的项目,分别是“会话超时”和“授权超时”。 - Todd Smith
如果会话超时但授权超时尚未发生,用户再次访问网站时,是否需要重新登录,即使最初已选择“记住我”? - ajbeaven
还要在 web.config 文件中设置“超时”值。 - o_o

3

当勾选“记住我”框时,您需要在处理登录的控制器方法中生成一个持久性Cookie。如果您使用的是RedirectFromLoginPage,请将createPersistentCookie参数设置为true


我现在使用以下代码创建cookie。if (rememberMe) { HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, true); cookie.Expires = DateTime.Now.Add(new TimeSpan(30, 0, 0, 0)); Response.Cookies.Add(cookie); }如何检查请求中是否有有效的cookie? - Tomas Aschan
我认为如果您获得了有效的会话cookie,则用户将在HttpContext中设置,并且他们不会被AuthorizationAttribute重定向到登录页面。 - tvanfosson

3

以下方法可以帮助我维持一个 cookie。

注意,如果用户取消勾选“记住我”,您需要删除该 cookie。

   private const string RememberMeCookieName = "MyCookieName";



        private string CheckForCookieUserName()
        {
            string returnValue = string.Empty;
            HttpCookie rememberMeUserNameCookie = Request.Cookies.Get(RememberMeCookieName);
            if (null != rememberMeUserNameCookie)
            {
                /* Note, the browser only sends the name/value to the webserver, and not the expiration date */
                returnValue = rememberMeUserNameCookie.Value;
            }

            return returnValue;
        }

        private void CreateRememberMeCookie(string userName)
        {
            HttpCookie rememberMeCookie = new HttpCookie(RememberMeCookieName, userName);
            rememberMeCookie.Expires = DateTime.MaxValue;
            Response.SetCookie(rememberMeCookie);
        }

        private void RemoveRememberMeCookie()
        {
            /* k1ll the cookie ! */
            HttpCookie rememberMeUserNameCookie = Request.Cookies[RememberMeCookieName];
            if (null != rememberMeUserNameCookie)
            {
                Response.Cookies.Remove(RememberMeCookieName);
                rememberMeUserNameCookie.Expires = DateTime.Now.AddYears(-1);
                rememberMeUserNameCookie.Value = null;
                Response.SetCookie(rememberMeUserNameCookie);
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接