none
关于ASP.NET Forms 身份验证永久保存用户登录状态 RRS feed

  • 问题

  • http://files.cnblogs.com/ret00100/WebSite1.rar

    上面简单的例子。
    但为什么FormsAuthentication.RedirectFromLoginPage(UserName, true);//这怎么不是永久保存??用了FF看了设置为true的话就30分钟后过期。如何有操作的话例如29分钟刷新页面了,到了到期时间它会自动的再延长30分钟。但这个不是很好啊。
    msdn好像是说RedirectFromLoginPage第二的参数设置为true的话是永久?
    是不是我设置有问题呢??
    2009年10月31日 1:54

答案

  • 注意:不能调整到2059年,是因为程序执行到你调整日期之间已经消耗掉了一部分时间的

    以上在代码在ie8,ff3.5上测试通过。

    另外需要注意的是:cookie是有大小和个数限制的,如果你还利用cookie存储其他信息,浏览器有可能会清除一些cookie以供新的cookie使用

    【孟子E章】
    • 已标记为答案 Xhp 2009年11月3日 2:19
    2009年11月3日 1:38
    版主

全部回复

  • FormsAuthentication.RedirectFromLoginPage(UserName, true);这个方法通过web.config
      <authentication mode="Forms">
                <forms slidingExpiration="true" timeout ="30" ></forms>
            </authentication>
    配置

    slidingExpiration="true属性是否每次刷新 更新时间挺长

    用RedirectFromLoginPage虽然方便,但都封装好了的,不如自己写  
    2009年10月31日 4:45
  • 但  <authentication mode="Forms">
             这里不设置timeout=30的话就会是会话结束时结束哦?
            </authentication>

    为什么?还有这么设置永久保存
    2009年10月31日 6:31
  • createPersistentCookie

    若要创建持久 Cookie(跨浏览器会话保存的 Cookie),则为 true;否则为 false


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年10月31日 6:37
    版主
  • createPersistentCookie
    类型:System..::.Boolean

    指定是否必须发出持久 Cookie(基于会话或比会话更持久的 Cookie)。

    那如果要创建永久的登录状态呢?又该怎么做



     protected void Page_Load(object sender, EventArgs e)
        {
            if (User.Identity.IsAuthenticated)
                Response.Redirect("admin/Default.aspx");
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string UserName = TextBox1.Text;

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.MaxValue, true, "");
            string encTicket = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true));
          //  FormsAuthentication.RedirectFromLoginPage(UserName, false);//这怎么不是永久保存??
        }


    这样的话FF看。显示cookies 是会话结束时。DateTime.MaxValue。。了 。。这么还是这样想不明白。。有高手知道吗

    2009年10月31日 6:43
  • 你问的问题很矛盾啊
    FormsAuthentication.RedirectFromLoginPage(UserName, false);//这怎么不是永久保存?? 你设置false 表示不保存cookie

    2009年10月31日 9:09
  • 什么矛盾?  
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true));
          //  FormsAuthentication.RedirectFromLoginPage(UserName, false);//这怎么不是永久保存??

    我注释了啊
    2009年10月31日 9:11
  • 你问的是注释上面的代码 不保存永久cookie吗?
    2009年10月31日 9:24
  • 但  <authentication mode="Forms">
             这里不设置timeout=30的话就会是会话结束时结束哦?
            </authentication>

    为什么?还有这么设置永久保存
    不设置的话 默认是30
    2009年10月31日 9:33
  • FormsAuthentication.RedirectFromLoginPage(UserName, true);//这怎么不是永久保存??
      <authentication mode="Forms">
       <forms loginUrl="Login.aspx" defaultUrl="admin/Default.aspx" name="cs">
       </forms>
      </authentication>

    我代码里面的设置。/

    那为什么它还是不能保存永久cookie
    2009年11月1日 14:03
  • createPersistentCookie
    类型:System..::.Boolean

    指定是否必须发出持久 Cookie(基于会话或比会话更持久的 Cookie)。

    那如果要创建永久的登录状态呢?又该怎么做



     protected void Page_Load(object sender, EventArgs e)
        {
            if (User.Identity.IsAuthenticated)
                Response.Redirect("admin/Default.aspx");
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string UserName = TextBox1.Text;

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.MaxValue, true, "");
            string encTicket = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true));
          //  FormsAuthentication.RedirectFromLoginPage(UserName, false);//这怎么不是永久保存??
        }


    这样的话FF看。显示cookies 是会话结束时。DateTime.MaxValue。。了 。。这么还是这样想不明白。。有高手知道吗

    还有这里我不用RedirectFromLoginPage了。。注释了。用另外的方法。把时间改为最大了还是不能永久保存哦Why
    2009年11月1日 14:15
  • 我没有设置30分钟!!!!

    但  <authentication mode="Forms">
             这里不设置timeout=30的话就会是会话结束时结束哦?
            </authentication>

    为什么?还有这么设置永久保存
    这只是之前的测试设置30分钟的话。FormsAuthentication.RedirectFromLoginPage(UserName, true);为true的话!:这样时间30分钟没错

    否则不设置30分钟FormsAuthentication.RedirectFromLoginPage(UserName, true);为true的话:会话结束时结束

    我上面给我代码没有设置30的!!

    不设置的话 默认是30 ??
    默认不是30!

    默认是关闭浏览器就结束。不信你试试!

    h呵呵 我只是从asp.net2.0书上看说明  
    很遗憾 我照的你的方法 去测试了 默认不是关闭浏览器结束 无论ff ie还是显示  设置false是关闭滤清器结束
    2009年11月1日 14:41
  • 对对true的话30分钟后自动的延长!但还没解决我的问题呢。如何能够永久保存。!
    为false的话就X掉就没了。

    2009年11月2日 2:42
  • 楼主你好,

    个人觉得永久保存没有意义。能保存个两三年就不错了。如果那样你可以直接设置过期时间就行了。
    Microsoft Online Community Support
    2009年11月2日 3:59
  • 我需要的是永久保存。知道清空或者退出就失效!三两年其实和99年100年也是没什么区别的。只是把年份改一下。但我想要的是可选的永久保持,这种好常见。登录下面有个复选框钩了就永久
    2009年11月2日 4:04
  • 楼主你好,

    我非常理解你的需求。但是我不知道永久保存的意义。用户电脑两三年都不重装的已经很少见了。另外用户每次登录的时候可以检测下过期时间,如果将要过期了可以再次延长日期也是一种替代的解决方法。


    Microsoft Online Community Support
    2009年11月2日 5:18
  • 但是你不觉得直接保存一个99年或者更久的,不好吗。我只是觉得奇怪。

    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.MaxValue, true, "");
            string encTicket = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true));
    这样DateTime.MaxValue也不能

    2009年11月2日 6:43
  •  DateTime.Now.AddYears(100)可以;
    2009年11月2日 7:57
  • 额.。试过了。。好像也不行啊

    而且
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.MaxValue, true, "");
    MaxValue了。。

     <authentication mode="Forms">
       <forms loginUrl="Login.aspx" defaultUrl="admin/Default.aspx" name="cs">
       </forms>
      </authentication>


      protected void Button1_Click(object sender, EventArgs e)
        {
            string UserName = TextBox1.Text;

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddDays(10), true, "");
            string encTicket = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true));
        }


    过期时间:当会话结束时。。。 why?

    2009年11月2日 8:25
  • 我觉得cookie最长时间是一年
    timeout的值最大是int范围  超过这个int范围可能无效
    2009年11月2日 13:40
  • 对于永不过期的 Cookie,可将到期日期设置为从现在起 50 年
    【孟子E章】
    2009年11月3日 0:37
    版主
  • Cookie的最长时间为1年的~~~
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年11月3日 1:11
    版主
  • 创建50年Forms验证的全过程:
    1,web.config
    <?xml version="1.0"?>
    <configuration>
    	<system.web>
    		<authentication mode="Forms">
    			<forms name="LoginForm" loginUrl="Login.aspx" path="/" timeout="26280000" slidingExpiration="true">
    			</forms>
    		</authentication>
    		<authorization>
    			<deny users="?"/>
    			<allow users="*"/>
    		</authorization>
    	</system.web>
    	<system.codedom></system.codedom>
    	<system.webServer></system.webServer>
    </configuration>
    

    Login.aspx
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server"> 
      protected void Button1_Click(object sender, EventArgs e)
      {
        String username = UserName.Text;
        if (username.EndsWith("mxh", StringComparison.InvariantCultureIgnoreCase) && Password.Text.EndsWith("mxh", StringComparison.InvariantCultureIgnoreCase))
        {
          FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,//票证的版本号
          username,//与身分验证票关联的用户名
          DateTime.Now, //票证发出时的本地日期和时间
          DateTime.Now.AddYears(50),//票证过期的本地日期和时间
          true,// 如果票证存储在持久性cookie中(跨浏览器会话保存)则为 true 否则为false 如果票证储存在URL中,将忽略此值
          "admin|reader|editor",//储存在票证中持定的用户信息
          FormsAuthentication.FormsCookiePath //票证储存在cookie中的路径
          );
    
          //如果 forms 元素的 protection 属性设置为 All 或 Encryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。
          /*
            string encTicket = FormsAuthentication.Encrypt(ticket);
          HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
          cookie.Path = FormsAuthentication.FormsCookiePath;
          cookie.Domain = FormsAuthentication.CookieDomain;
          cookie.Expires = DateTime.Now.AddYears(50);
           */
          FormsAuthentication.RedirectFromLoginPage(username, true);
          //Response.Cookies.Add(cookie);
    
          //Response.Redirect("Default6.aspx");
        }
        else
        {
          Response.Write("密码不正确");
        }
      }
    
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!Page.IsPostBack)
        {
          Password.Attributes.Add("value", "mxh");
        }
      }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
      <title>无标题页</title>
    </head>
    <body>
      <form id="form1" runat="server">
      <div>
        用户名:<asp:TextBox ID="UserName" runat="server" Text="mxh" />mxh
        <br />
        密码:<asp:TextBox ID="Password" TextMode="password" runat="server" Text="mxh" />mxh<br />
        <asp:Button ID="Button1" Text="登录" runat="server" OnClick="Button1_Click" />
      </div>
       </form>
    </body>
    </html>
    
    测试显示页面页面Default6.aspx
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
      protected void Page_Load(object sender, EventArgs e)
      {
        Response.Write(Page.User.Identity.IsAuthenticated.ToString() + " = " + Page.User.Identity.Name);
    
        Response.Write(DateTime.Now.ToString());
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
      <title></title>
    
    </head>
    <body>
      <form id="form1" runat="server">
    
      </form>
    </body>
    </html>
    
    将以上代码放在你的站点里,注意:如果你测试没有效果,请原封不动地拷贝

    测试以本地时间访问Default6.aspx,点击登录,关闭所有浏览器窗口。将计算机日期时间调整到2049年,再打开浏览器浏览Default6.aspx

    【孟子E章】
    2009年11月3日 1:36
    版主
  • 注意:不能调整到2059年,是因为程序执行到你调整日期之间已经消耗掉了一部分时间的

    以上在代码在ie8,ff3.5上测试通过。

    另外需要注意的是:cookie是有大小和个数限制的,如果你还利用cookie存储其他信息,浏览器有可能会清除一些cookie以供新的cookie使用

    【孟子E章】
    • 已标记为答案 Xhp 2009年11月3日 2:19
    2009年11月3日 1:38
    版主
  • 请问下一定得在web.config写timetout吗?。。不能在后台写add50年吗?因为这种保存的形式来源于用户自己的选择的。

    恩恩 可以了谢谢了。。明白了呵呵
    • 已编辑 Xhp 2009年11月3日 2:28
    2009年11月3日 2:23
  • web.config写50,代码写用户选项
    【孟子E章】
    2009年11月3日 2:27
    版主
  •    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                    strUserName,
                    DateTime.Now,
                    DateTime.Now.AddYears(30),
                    true,
                     "",
                    FormsAuthentication.FormsCookiePath);
                    string encTicket = FormsAuthentication.Encrypt(ticket);
                   // Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                    HttpCookie c = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
                    if (Ckbset.Checked)
                        c.Expires = DateTime.Now.AddYears(99);
                    Response.Cookies.Add(c);

    额像这样 protection 属性设置为 All 。。。吗?
    2009年11月3日 2:51