Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在asp.net中设置会话超时和会话空闲超时_C#_Asp.net_.net_Session_Session Timeout - Fatal编程技术网

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

C# 如何在asp.net中设置会话超时和会话空闲超时,c#,asp.net,.net,session,session-timeout,C#,Asp.net,.net,Session,Session Timeout,我有一个简单的问题,但找不到解决办法。我已在web.config中将应用程序的会话超时设置为: <sessionState timeout="30" mode="InProc"/> 工作正常,但现在我得到了一个要求,如果用户空闲,也就是说,他在一分钟内没有在页面上执行任何操作,那么他的会话应该过期。我尝试使用表单身份验证进行验证,如下所示: <authentication mode="Forms"> <forms loginUrl="~/Log

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

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

工作正常,但现在我得到了一个要求,如果用户空闲,也就是说,他在一分钟内没有在页面上执行任何操作,那么他的会话应该过期。我尝试使用表单身份验证进行验证,如下所示:

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


但它现在起作用了。任何帮助都将不胜感激。

如果我正确理解了问题(请参见OP的评论),那么问题是OP希望
滑动过期
绝对过期
都处于活动状态,但有单独的超时

这将允许系统要求用户在一定的空闲时间后重新登录,并要求用户在不同的时间后重新登录,即使用户没有空闲

遗憾的是,使用
表单身份验证
时,不支持开箱即用。您必须选择滑动或绝对过期。或者你必须自己建立一个解决方案

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

  • 会话的超时设置为比相应的窗体身份验证超时长,也比所需的绝对超时长:

    <sessionState timeout="35" mode="InProc"/>
    
  • 应用程序\u 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分钟后超时似乎过于偏执。在此期间,即使是快速用户也无法完成应用程序中的任何重要工作。甚至我的网上银行也有更长的空闲超时时间。我建议至少5-10分钟
  • 表单身份验证中的滑动过期有一个有趣的特性:滑动是通过更新身份验证cookie来实现的,当用户处于活动状态时,将过期日期向前移动。但只有当过期时间至少超过一半时,才会发生这种情况。如果要保证用户可以空闲10分钟而不注销,则必须将超时设置为20分钟

请注意,在
asp.net
中,登录/身份验证和会话是两件独立的事情。会话不会因为身份验证状态更改而自动清除/清空。另一方面,即使您保持登录状态,会话也可能会过期。@user1429080您能建议解决此问题的任何方法吗。谢谢,你想发生什么事?您已将会话设置为30分钟后超时,身份验证超时设置为1分钟。到底是什么不起作用?请看我的要求是,如果用户空闲,也就是说,他在一分钟内没有在页面上执行任何操作,他应该被重定向到登录页面。但是,如果他正在写这一页,他的对话应该持续30分钟。感谢简单地说,我希望空闲会话超时和会话超时分开。
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();
        }
    }
}