Тайм-аут сеанса MVC3 через 10 секунд - PullRequest
1 голос
/ 24 марта 2012

Нужна помощь с проблемой тайм-аута сеанса в веб-приложении ASP.Net.По сути, сессия истекает через 10-15 секунд после входа в систему.

Примечание. Я использую пользовательскую комбинацию FormsAuthentication и базовой безопасности.

My Session.IsNewSession устанавливается в значение true после 3-4 хороших обратных передач после входа в систему.

My 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>

Где я считаю, что время ожидания относится к минутам ...

У меня есть приложение MVC 3 с зарегистрированным ActionFilter

    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 Ответ

1 голос
/ 26 марта 2012

Итак, я определил, что веб-сервер обновлял свой AppPool быстрее, чем продолжительность моей сессии. Это приведет к тому, что будет использоваться тот же SessionId, но также будет установлен флаг IsNewSession.

Поскольку у меня нет контроля над продолжительностью жизни AppPool, я смог сохранить сеанс в режиме InProc в IIS.

Я решил проблему, перенеся сохранение состояния сеанса в размещенную базу данных SqlServer, что позволило сеансу сохраняться, несмотря на перезапуск AppPool.

Я бы порекомендовал решение для любого другого человека, который видит, что его в противном случае стабильный веб-сайт теряет свое состояние сеанса при размещении на сервере, к которому у него нет административного доступа.

О, и я обнаружил, что журналы IIS здесь довольно бесполезны. Я обнаружил, что лучшей регистрацией диагноза здесь была моя ручная регистрация, чтобы определить, что это был сценарий.

...