none
持久化的cookie不会受到web.config中的<forms>节点中设置的超时的影响? RRS feed

  • 问题

  • 经常看到书中说在forms认证时,持久化的cookie不会受到web.config中的<forms>节点中设置的超时的影响,可是我做了个测试,总是会受到<forms>设置的影响,只要一超过web.config中的设置时间,再刷新default.aspx页面,就会跳转到login.aspx, 代码很简单
    //为了测试,改成了1分钟 <forms name="ao" loginUrl="login.aspx" timeout="1" cookieless="UseDeviceProfile" protection="All" defaultUrl="Account/default.aspx" /> </authentication>



    login页面

    C# code

    protected void Page_Load(object sender, EventArgs e) { if (User.Identity.IsAuthenticated) { //如果一开始能跳转到受保护的页面,说明持久化cookie起作用 Response.Redirect("Account/default.aspx"); } } protected void btnLogin_Click(object sender, EventArgs e) { if (FormsAuthentication.Authenticate(txtUserName.Text, txtUserPasswork.Text)) { HttpCookie cookie = FormsAuthentication.GetAuthCookie(txtUserName.Text, true); cookie.Expires = DateTime.Now.AddDays(7); Response.Cookies.Add(cookie); Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUserName.Text, true)); } else { throw new Exception("登录失败!"); } }

    2012年5月31日 15:01

全部回复

  • 急,请大虾指点!!!
    2012年5月31日 22:12
  • FormsAuthentication.SetAuthCookie(txtUserName.Text, true);
    这样创建持久化的cookie吧
    2012年6月1日 0:59
    版主
  • 用  FormsAuthentication.GetAuthCookie(TextUserName.Text, true);  创建的!!
    2012年6月1日 10:49
  • 用  FormsAuthentication.GetAuthCookie(TextUserName.Text, true);  创建的!!

    上面的验证代码用的是下面的第2种方法,第1,第2,都表现为只要web.config中的time超时,cookie似乎就失效, 当然如果没有超时,关掉浏览器,再打开还能跳到受保护的default页面; 第3种方法似乎不受time值影响,但只要关浏览器就失效



                    //默认的第1种
                   // FormsAuthentication.RedirectFromLoginPage(TextUserName.Text, true);
                   
                    //第2种修改失效日期
                    //HttpCookie AuthCookie = FormsAuthentication.GetAuthCookie(TextUserName.Text, true);
                    //AuthCookie.Expires = DateTime.Now.AddDays(10);
                    //Response.Cookies.Add(AuthCookie);
                    //Response.Redirect(FormsAuthentication.GetRedirectUrl(TextUserName.Text, true));

                   //第3种
                    FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1,TextUserName.Text, DateTime.Now, DateTime.Now.AddDays(30),true, "c", "/"); //建立身份验证票对象
                    string HashTicket = FormsAuthentication.Encrypt(Ticket); //加密序列化票为字符串
                    HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);
                    Response.Cookies.Add(UserCookie);
                    Response.Redirect(FormsAuthentication.GetRedirectUrl(TextUserName.Text, true));
    2012年6月1日 11:40
  • 持久化的cookie不会受到web.config中的<forms>节点中设置的超时的影响”,这句话不全面。全面的应该是当年自己设置了过期时间的时候,那么不受影响。如果没设置,那么默认的,持久化Cookie的过期时间是webconfig中的设置,如果没设置,默认是30分钟。这也就是你“可是我做了个测试,总是会受到<forms>设置的影响,只要一超过web.config中的设置时间,再刷新default.aspx页面,就会跳转到login.aspx”的原因。可以参照下面的的创建Cookie的方法。

    /// <summary>
            /// 创建登录Cookie
            /// </summary>
            /// <param name="user"></param>
            /// <param name="expire">如果过期时间为DateTime.MinValue,则创建非持久化的Cookie。</param>
            /// <param name="userData">用户数据</param>
            /// <returns>HttpCookie</returns>
            public static HttpCookie CreateFormCookie(string user, DateTime expire, string userData = "")
            {
                bool isPersistent = !expire.Equals(DateTime.MinValue);
                DateTime now = DateTime.Now;
                //建立身份验证票对象
                FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, user, now, now.AddMinutes(30), isPersistent, userData, "/");
                //加密序列化验证票为字符串
                string HashTicket = FormsAuthentication.Encrypt (Ticket) ;
                HttpCookie formCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket) ;
                formCookie.HttpOnly = true;
                if (isPersistent) formCookie.Expires = expire;
                return formCookie;
            }

    2014年8月4日 13:49