增加已启动会话的超时

时间:2014-03-24 21:32:34

标签: c# asp.net session

我想添加一个"让我登录"我的自定义登录控件的选项。

这就是我目前使用会话的方式: 我手动保存并从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分钟。

&#34;退出&#34;:

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

通过带有文本框的自定义登录控件,我授予对成员区域的访问权限。 (我不会使用System.Web.Security.FormsAuthentication
输入有效凭据和选中复选框后,请继续登录&#34;,我希望将已经激活的会话的持续时间增加到约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;

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

你无法以这种方式真正接近它。你不能坚持几天的会议 - 它只是不能很好地扩展。

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

答案 1 :(得分:2)

我决定简要总结一下我是怎么做到的,因为@David Haney让我:

我在usertable中添加了一个列,其中包含一个GUID,用于“重新进入”/再次提供凭据。该GUID在登录时创建并存储在数据库中。 它还存储为cookie中的ecrypted值。 (我的网站不使用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);                    

从这里使用Helper.Protect和Helper.Unprotect How to use MachineKey.Protect for a cookie?将加密的MAC签名值存储在cookie中。

通过让每个内容页继承自一个实现该逻辑并继承自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
Demo