ASP.NET: Session.IsNewSession false после тайм-аута форм, но должно быть верно? - PullRequest
1 голос
/ 09 декабря 2010

Я работаю над настройкой / исправлением моего кода тайм-аута сеанса и изучил множество статей, таких как эта и эта публикация SO , чтобы узнать, как лучше всего это сделать.Решение для обнаружения тайм-аута сеанса, который я продолжаю видеть снова и снова, состоит в том, чтобы сначала проверить свойство Session.IsNewSession на true, а если да, то проверить, существует ли уже куки-файл сеанса.Я предполагаю, что логика заключается в том, что пользователь закончил свой последний сеанс с истекшим временем ожидания, начал новый сеанс, но старый cookie еще не был удаленКод для этих проверок выглядит следующим образом:

if (Context.Session != null)
{
    if (Session.IsNewSession)
    {
        string szCookieHeader = Request.Headers["Cookie"];
        if ((null != szCookieHeader) && (szCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
        {
            Response.Redirect("sessionTimeout.htm"); // or whatever code to handle timeout
        }  
    } 
}

Сейчас я работаю со значением времени ожидания сеанса 120 минут и значением времени ожидания форм 60 минут.Эти две строки из моего файла web.config, соответственно, находятся здесь:

<sessionState mode="InProc" cookieless="UseDeviceProfile" timeout="120" />
<authentication mode="Forms">
    <forms loginUrl="~/Home/Customer" timeout="60" name=".ASPXAUTH" requireSSL="false" slidingExpiration="true" defaultUrl="~/Home/Index" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
</authentication>

Итак, через 60 минут (я установил 1 для проверки), я делаю запрос к серверу, и яЯ полагаю, что автоматически перенаправляется в / Home / Customer из-за значения loginURL в моей строке web.config.

Проблема в том, что сеанс не заканчивается, и все мои проверки тайм-аута сеанса находятся в действии Домой / Клиент (я использую MVC).Таким образом, я перенаправлен на Home / Customer и выполняю описанные выше проверки, но когда я добираюсь до Session.IsNewSession, он ложный, потому что сессия все еще жива (я предполагаю, что я все еще в течение 120 минут, которые у меня есть)задано).

Итак, наконец, мой вопрос.Вся эта схема проверки тайм-аута сеанса работает только тогда, когда истекает время Session ?Или я могу заставить его работать на тайм-ауты Forms ?Может быть, решение состоит в том, чтобы установить значение тайм-аута моего сеанса так же, как значение тайм-аута форм?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

Cookie-файл сеанса ASP.NET и cookie-файл проверки подлинности с помощью форм фактически являются совершенно разными cookie-файлами - например, если пул приложений перезапускается, например, ваш пользователь потеряет свой сеанс, но не свою идентификационную информацию для входа (если вы используете сеанс in-proc).Я думаю, что единственный способ повлиять на ваш код - это если время ожидания вашего сеанса было меньше времени ожидания ваших форм.Любым другим способом, и вы будете перенаправлены на страницу входа в систему до того, как нажмете код тайм-аута сеанса.

Другой вариант - переместить код тайм-аута сеанса на страницу входа.

Третийбудет обрабатывать проверку в вашем global.asax.

0 голосов
/ 16 января 2014

Я только что проверил, что пользователь Джон Кристенсен сказал о

если время вашего сеанса было меньше времени ожидания ваших форм.

web.config

<system.web>
    <sessionState mode="InProc" timeout="1" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login"  defaultUrl="~/Account/Login" name="MyPortalAuth" timeout="2" />
    </authentication>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>

И, похоже, это рабочее решение.

Атрибут фильтра C #

public class SessionExpireFilterAttribute : ActionFilterAttribute
    {
        public UserManager<ApplicationUser> UserManager { get; private set; }

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

            // check if session is supported
            if (ctx.Session != null)
            {
                // check if a new session id was generated
                if (ctx.Session.IsNewSession)
                {
                    // If it says it is a new session, but an existing cookie exists, then it must
                    // have timed out
                    string sessionCookie = ctx.Request.Headers["Cookie"];
                    if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                    {

                        if (ctx.Request.IsAuthenticated)
                        {
                            FormsAuthentication.SignOut();
                        }
                        RedirectResult rr = new RedirectResult(loginUrl);
                        filterContext.Result = rr;
                        //ctx.Response.Redirect("~/Account/Logon");

                    }
                }                
            }

            base.OnActionExecuting(filterContext);
        }
    }
...