Asp.net mvc 用于会话超时处理的会话启动和操作筛选器

Asp.net mvc 用于会话超时处理的会话启动和操作筛选器,asp.net-mvc,asp.net-mvc-4,session,Asp.net Mvc,Asp.net Mvc 4,Session,我有一个带有Windows身份验证的MVC4应用程序。用户可以输入10个视图中任意一个的url来加载应用程序。没有特定的主页 如果用户空闲超过一分钟,我需要重定向到会话超时视图。我在配置文件中将会话超时值保持为一分钟。我创建了一个操作过滤器,用于检查一个特定的会话值。此特定会话值在Global.asax的session\u Start中设置 但是,当超时时间结束时,请求再次点击会话\u Start,并分配值。因此,我的操作筛选器没有重定向到错误视图。 克服这一问题的可能解决方案是什么 Web.C

我有一个带有
Windows身份验证的MVC4应用程序
。用户可以输入10个视图中任意一个的url来加载应用程序。没有特定的主页

如果用户空闲超过一分钟,我需要重定向到会话超时视图。我在配置文件中将会话超时值保持为一分钟。我创建了一个
操作过滤器
,用于检查一个特定的会话值。此特定会话值在
Global.asax
session\u Start
中设置

但是,当超时时间结束时,请求再次点击
会话\u Start
,并分配值。因此,我的操作筛选器没有重定向到错误视图。 克服这一问题的可能解决方案是什么

Web.Config

<system.web>
    <!--Impersonate-->
    <identity impersonate="true"/>
        <!--Session Mode and Timeout-->
    <sessionState mode="InProc" timeout="1" />
    <authentication mode="Windows">
    </authentication>
    <authorization>
      <allow users="?" />
    </authorization>    
</system.web>
Global.ASAX

protected void Session_Start(object sender, EventArgs e)
{
    Session["IsActiveSession"] = DateTime.Now;
}

只需检查
HttpContext.Current.session.IsNewSession
,查看是否为当前请求创建了新会话,而不是设置会话值并在操作筛选器中进行检查。修改动作过滤器后,您将得到如下结果:

[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class SessionCheckAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
    {
        string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
        HttpSessionStateBase session = filterContext.HttpContext.Session;
        if (session.IsNewSession)
        {
            //Redirect
            var url = new UrlHelper(filterContext.RequestContext);
            var loginUrl = url.Content("~/Error/SessionTimeout");
            filterContext.HttpContext.Response.Redirect(loginUrl, true);
        }

    }
}
如果您想了解并确保他们在为此请求创建的新会话之前有上一个会话,您可以更新
if
语句以检查是否随请求发送了旧会话cookie:

string cookieHeader = filterContext.HttpContext.Request.Headers["Cookie"];
if (session.IsNewSession && cookieHeader != null && cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)
{
    ...
}

但是,由于看起来您正在将它们发送到登录页面,所以在这里您可能不必担心这一点。如果使用此检查,请注意,此代码采用默认的
“ASP.NET\u SessionId”
cookie名称;这可以在您的web.config中更改,在这种情况下,您需要使用新的cookie名称更新
IndexOf
参数,或者。

Reference:和Blog post链接已断开。谢谢,我已将其替换。用于解释如何检查旧会话的链接并不理想,因此我刚刚将解释内联移动。
string cookieHeader = filterContext.HttpContext.Request.Headers["Cookie"];
if (session.IsNewSession && cookieHeader != null && cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)
{
    ...
}