10秒后MVC3会话超时

时间:2012-03-24 06:07:35

标签: c# asp.net-mvc-3 forms-authentication session-state session-timeout

在ASP.Net Web应用程序中需要一些会话超时问题的帮助。基本上会话在登录后大约10-15秒到期。

备注:我使用FormsAuthentication和基本安全性的自定义组合

我的Session.IsNewSession在登录后3-4次良好的回发后设置为true。

我的Web.Config有以下内容......

<sessionState mode="InProc" timeout="130" regenerateExpiredSessionId="true" stateNetworkTimeout="120" compressionEnabled="true" cookieless="UseCookies" />
<authentication mode="Forms">
  <forms timeout="120" ticketCompatibilityMode="Framework40" enableCrossAppRedirects="true" />
</authentication>

我相信超时是指分钟......

我有一个注册了ActionFilter的MVC 3应用程序

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new MyActionFilterAttribute());
    }

在OnActionExecuting内部,我检查当前会话,以防止访问未经授权的用户无法访问的控制器操作。

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {            
        HttpContext ctx = HttpContext.Current;

        Player player = SessionHelper.GetCurrentPlayer(filterContext.HttpContext.Session);

        if (player == null && ctx != null)
        {
            player = SessionHelper.GetCurrentPlayer(ctx.Session);
        }

        if (player == null ||
            (player.IsAdministrator == false && player.IsCoach == false && player.IsCommittee == false))
        {
            if (filterContext.Controller is HomeController || filterContext.Controller is AccountController)
            {
                base.OnActionExecuting(filterContext);
                return;
            }

            string ctxError = ctx != null ? "Context Exists" : "Context Doesnt Exist";
            string sessionError = filterContext.HttpContext.Session != null ? "filterContext.HttpContext.Session Exists" : "filterContext.HttpContext.Session Doesnt Exist";
            string requestSessionError = filterContext.RequestContext.HttpContext.Session != null ? "filterContext.RequestContext.HttpContext.Session Exists" : "filterContext.RequestContext.HttpContext.Session Doesnt Exist";

            throw new SecurityException(string.Format("Attempt to access {0} by user at {1} - {2} ({3}, {4}, {5})",
                                                      filterContext.HttpContext.Request.RawUrl,
                                                      filterContext.HttpContext.Request.UserHostAddress,
                                                      filterContext.HttpContext.Session,
                                                      ctxError,
                                                      sessionError,
                                                      requestSessionError));
        }

        base.OnActionExecuting(filterContext);
    }

1 个答案:

答案 0 :(得分:1)

所以我确定Web服务器比我的会话生命周期更快地刷新它的AppPool。这将导致使用相同的SessionId,但也要设置IsNewSession标志。

由于我无法控制AppPool的生命周期,因此我能够将会话保持在IIS中的InProc模式。

我通过将会话状态持久性移动到托管的SqlServer数据库来解决了这个问题,从而允许会话在AppPool被回收的情况下继续存在。

我建议任何其他人在他们没有管理员权限的服务器上托管他们原本稳定的网站时失去会话状态的解决方案。

哦,我发现IIS日志在这里毫无用处。我发现,这里记录的最佳诊断是我自己的手动记录,以确定这是情景。