增加已启动会话的超时时间

本文关键字:超时 时间 会话 启动 增加 | 更新日期: 2023-09-27 17:52:43

我想添加一个"keep me logged in"选项到我的自定义登录控件。

这是我目前使用会话的方式:我手动保存和读取HttpContext.Current.Session["key"]的值。没问题。

web.config相关部分:

<sessionState mode="StateServer" useHostingIdentity="true" cookieless="false" timeout="120" stateConnectionString="tcpip=127.0.0.1:42424" />
<authentication mode="Forms">
  <forms loginUrl="/login" name="AuthCookie" timeout="120" slidingExpiration="true" path="/" />
</authentication>
<authorization>
 <allow users="*" />
</authorization>

可以看到,会话的默认持续时间是120分钟。

"注销"

:

  Session.Clear();
  Session.Abandon();

通过带有文本框的自定义登录控件,我授予对成员区域的访问权限。(我不使用System.Web.Security.FormsAuthentication)
在输入有效的凭据并选中"保持登录"复选框后,我想将已经激活的会话的持续时间增加到~30天。

到目前为止,我找到了像

这样的解决方案
FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, "username", DateTime.Now, DateTime.Now.AddMinutes(1), false, "username");
string encTicket = FormsAuthentication.Encrypt(fat);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = fat.Expiration });

不工作,因为System.Web.Security.FormsAuthentication.Timeout仍然是120分钟。设置

也是如此
Session.Timeout = 666;

有什么建议吗?

增加已启动会话的超时时间

你不能这么做。你不能让一个会话持续好几天——它不能很好地扩展。

大多数人所做的是提供一种自动登录的方法,这样当他们的会话到期时,他们可以在下一次操作/重新加载时无缝地重新登录。大多数人使用包含唯一散列的cookie来完成此操作,该cookie在服务器上进行检查。如果您希望该用户登录30天,您只需将cookie设置为30天后过期。

我决定给一个简短的总结我是如何结束的,因为@David Haney要求我:

我在usertable中添加了一个列,其中包含一个GUID,用于"重新登录"/再次提供凭据。该GUID在登录时创建并存储在数据库中。它还作为加密值存储在cookie中。(我的网站不使用SSL)

添加到登录例程(如果用户选中了"记住我"复选框):

HttpCookie aCookie = new HttpCookie("Session");
Guid sessionGuid =  // Buisiness layer call to generate value
String sessionID = sessionGuid.ToString();
aCookie.Value = Helper.Protect(sessionID, "sessionID");
aCookie.Expires = DateTime.Now.AddDays(30);
Response.Cookies.Add(aCookie);                    

助手。保护和帮助。如何使用MachineKey。保护一块饼干?在cookie中存储经过加密和MAC签名的值

重新记录是通过让每个内容页从一个类继承来完成的,这个类实现了该逻辑并继承了System.Web.UI.Page

public class BasePage : System.Web.UI.Page
{
 protected override void OnInit(EventArgs e)
 {
    base.OnInit(e);
   if (Request.Cookies["Session"] != null && !CustomIsLoggedInCheckMethod)
   {
     String unprotected = Helper.Unprotect(Request.Cookies["Session"].Value, "sessionID");
     Guid sessionID = Guid.Parse(unprotected);
    // Calls to buisiness layer to get the user, set sessions values et cetera
   }
 }
}

如果用户在上次会话后被禁止或注销,cookie值过期日期将设置为过去的日期:

HttpCookie myCookie = new HttpCookie("Session");
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);

编辑:啊,我忘了说这个。我还添加了一个通知栏,告诉用户他已经重新登录了。它基于http://blog.grio.com/2012/11/a-copypaste-ble-jquery-notification-bar.html
看到演示