ASP.NET MVC Session.IsNewSession проблема с Google Chrome - PullRequest
8 голосов
/ 25 марта 2011

В настоящее время я работаю над частью логики Session expired для моего проекта ASP.NET 3.5 MVC 2, чтобы выйти из системы пользователя и перенаправить его в действие AccountOontroller LogOn.

У меня есть следующий атрибут во всех моих действиях, связанных с состоянием сеанса, и этот фрагмент кода работает в IE 8, но не в Firefox 4 или Google Chrome 10. Симптом возникает, когда я пытаюсь перейти к представлению, представленному действие с моим атрибутом [SessionExpireFilter], свойство ctx.Session.IsNewSession в приведенном ниже коде оценивается как «true» каждый раз, даже если я только на секунд в моем 30-минутном сеансе.

public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

        // check if session is supported 
        if (ctx.Session != null && 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))
            {
                FormsAuthentication.SignOut();
                ctx.Response.Redirect("~/Account/LogOn");
            }
        }

        base.OnActionExecuting(filterContext);
    }
} 

Есть ли способ выяснить, почему Chrome и Firefox ведут себя так, а IE - нет? Заранее спасибо.

РЕДАКТИРОВАТЬ: Это не работает в FF, как я изначально верил. Я сразу после входа в систему пытаюсь получить доступ к своему действию с помощью моего атрибута SessionExpireFilter.

Ответы [ 2 ]

14 голосов
/ 25 марта 2011

ASP.NET будет создавать новый сеанс для каждого запроса, если вы не сохраните в нем что-либо. Попробуйте добавить код ниже к вашему Global.asax. Он работает в моих приложениях MVC2 и MVC3 с одинаковыми SessionExpireFilterAttribute.

protected void Session_Start()
{
    Session["Dummy"] = 1;
}
1 голос
/ 17 июля 2015

Мы можем добавить метод session_start в Golbal.asax файл в приложении MVC.

  protected void Session_Start(object sender, EventArgs e)
      {                    
       HttpContext.Current.Session.Add("UserId" , null);
      }

Тогда при запуске приложения будет создан ваш сеанс.и тогда сессия не будет isNewSession 'True' , в противном случае это будет всегда 'True'

...