如何在asp.net中设置会话超时和会话空闲超时

时间:2017-01-24 09:53:57

标签: c# asp.net .net session session-timeout

我有一个简单的问题,但无法找到解决方案。我已在web.config中将应用程序的会话超时设置为:

  <sessionState timeout="30" mode="InProc"/>

并且它工作正常,但现在我得到了如果用户空闲的要求,他没有在页面上执行任何操作一分钟他的会话应该过期。我尝试使用表单身份验证:

<authentication mode="Forms">
      <forms loginUrl="~/Login.aspx" timeout="1"  slidingExpiration ="false" defaultUrl="login.aspx"/>
    </authentication>

但它现在正在发挥作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果我已正确理解了该问题(请参阅OP的评论),那么问题是OP希望slidingExpirationabsoluteExpiration都处于活动状态,但会有单独的超时。

这将使系统能够要求用户在空闲一段时间后重新登录,并要求用户在不同的时间之后重新登录,即使用户没有空闲。

不幸的是,使用forms authentication不支持开箱即用。您必须选择滑动或绝对过期。或者你必须自己建立一个解决方法。

您可以通过以下方式使用非常简单的解决方法:

  • session的超时设置为超过相应的表单身份验证超时,并且还超过所需的绝对超时:

    <sessionState timeout="35" mode="InProc"/>
    
  • 将表单身份验证设置为使用slidingExpiration = true

  • 每当用户登录时,在会话中创建一个用户登录时间戳:

    Session["userLoggedInAt"] = DateTime.UtcNow;
    
  • Application_PostAcquireRequestState方法添加到Global.asax

    void Application_PostAcquireRequestState(object sender, EventArgs e)
    {
        HttpContext context = ((HttpApplication)sender).Context;
        if (context.Session != null && context.User.Identity.IsAuthenticated)
        {
            bool forceLogout = false;
            if (context.Session["userLoggedInAt"] == null)
                forceLogout = true;
            else if (!(context.Session["userLoggedInAt"] is DateTime))
                forceLogout = true;
            else if (DateTime.UtcNow > ((DateTime)context.Session["userLoggedInAt"]).AddMinutes(30))
                forceLogout = true;
    
            if (forceLogout)
            {
                FormsAuthentication.SignOut();
                FormsAuthentication.RedirectToLoginPage();
            }
        }
    }
    

免责声明:上面的代码很快被黑客攻击,可能不是万无一失......

备注

  • 在1分钟后将滑动到期设置为超时似乎过于偏执。即使 fast 用户也无法在此期间完成应用程序中的任何重要工作。甚至我的网上银行也有更长的空闲超时。我建议至少5-10分钟。
  • 表单身份验证中的滑动过期具有感兴趣的功能:通过更新身份验证cookie,在用户处于活动状态时向前移动过期日期来进行滑动。但这只发生在到期时间至少一半时。如果您想保证用户可以闲置10分钟而不退出,则必须将超时设置为20分钟。