ASP.NET表单身份验证过期

9

有人能解释一下ASP.NET表单身份验证是如何工作的吗?因为我似乎不理解,而且我一直被注销。

目前,我有用户名、密码和一个“保持登录状态”复选框。 我将使用这些值创建票证和cookie,如下所示:

    // Create ticket
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,email,DateTime.UtcNow,DateTime.UtcNow.AddMinutes(30),remember,String.Empty);

    // Encrypt ticket
    string cookie_contents = FormsAuthentication.Encrypt(ticket);

    // Create cookie
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,cookie_contents);

    if (remember) {
        cookie.Expires = DateTime.UtcNow.AddDays(90);
    }

    cookie.Path = FormsAuthentication.FormsCookiePath;
    cookie.Secure = true;

    // Add cookie to response
    Response.Cookies.Add(cookie); 

我希望通过这段代码,能够登录我的网站并保持登陆状态,假设我勾选了“保持登录状态”,那么我至少可以保持90天的登录状态?

然而我现在遇到的问题是,我在初始登录后只能保持30分钟就会被强制登出(这可能是ticket保持时间?)。

那么cookie过期和ticket过期有什么区别,如何保持登录状态呢?我需要将cookie和ticket的过期时间都设置为90天吗?

1个回答

25

如果可以避免的话,不要直接操作cookie。您可以使用FormsAuthentication.SetAuthCookie(username, persistent)来登录用户。这里的“persistent”表示“不使用会话cookie”。

然后,您应该在web.config中指定cookie到期时间。

 <system.web>
   <authentication mode="Forms">
             <forms timeout="50000000" slidingExpiration="true"/>
   </authentication>
 </system.web>

滑动过期意味着每个请求都会更新cookie。超时时间以分钟为单位,因此示例时间很长 :)

看看这个问题和Scott Gu博客的链接:Forms Authentication Cookie Expiration


关于使用 SSL 的 cookie.Secure 怎么样?我已经在表单标签中添加了 requireSSL。另外,slidingExpiration 会根据活动自动更新,但是如果没有活动呢?比如我关闭浏览器然后过一会再回来... - Lloyd
是的,在上面的标记中添加 requireSSL="true" 将使其成为安全 cookie。另一个好的标记是 enableCrossAppRedirects="false"。 - MikeSmithDev
1
好的,我想我明白了。将超时设置为像30天这样疯狂的值,滑动过期时间会处理剩下的事情,如果在那个时间范围内用户没有登录,它就会过期。 - Lloyd
提供的Scott Gu的博客链接是最好的途径。 - Grijan
如果不使用会话cookie,那么要使用什么? - Kiquenet
显示剩余4条评论

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