Как обрабатывать тайм-аут сеанса в MVC 3

У меня проблемы с частым тайм-аутом сеанса.

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


person vivek    schedule 30.06.2011    source источник
comment
Шаблонное приложение Visual Studio MVC делает это. Я бы предложил взглянуть на него.   -  person 3Dave    schedule 30.06.2011
comment
спасибо Дэвид. Я не мог найти его. Буду признателен за любые ссылки. Спасибо   -  person vivek    schedule 30.06.2011
comment
Я отредактировал ваш вопрос, чтобы сделать его более точным и использовать соответствующие теги.   -  person jgauffin    schedule 30.06.2011


Ответы (4)


Вы можете попробовать что-то вроде этого:

public class SessionExpireAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        base.OnActionExecuted(filterContext);
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Session != null) {
            if (filterContext.HttpContext.Session.IsNewSession) {
                var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
                if ((sessionCookie != null) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
                    // redirect to login
                }
            }
        }
    }
}
person gram    schedule 30.06.2011
comment
+1. Возможно, вы захотите проверить, является ли запрос ajax, а затем установить тип содержимого "text/javascript" и тело ответа на "document.location = 'redirecturi'". - person jgauffin; 30.06.2011
comment
@jgauffin я новичок в mvc, так что можете ли вы дать пример кода для document.location = 'redirecturi, как это сделать? - person Rikin Patel; 31.10.2012

Здесь больше, чем кажется на первый взгляд. Вот более полный OnActionExecuting, который использует ту же концепцию, что уже обсуждалась выше, но добавляет немного больше. См. встроенные комментарии для получения дополнительной информации. Вызываемая «InitializeSession» — это настраиваемая функция, которая создает основные атрибуты, необходимые в состоянии сеанса для запуска сайта. «AlertWarning» — это вспомогательная процедура для отображения предупреждений. Все остальное — шаблонный код.

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
  var bRequiresAuthorization =
    (filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0) ||
    (filterContext.Controller.GetType().GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0);

  if (filterContext.HttpContext.Session != null)
  {
    if (filterContext.HttpContext.Session.IsNewSession)
    {
      //New session.  Initialize Session State
      bool b = InitializeSession(null);

      if (bRequiresAuthorization )
      {
        //Action requested requires authorized access.   User needs to authenticate this
        //new session first, so redirect to login
        string cookie = filterContext.HttpContext.Request.Headers["Cookie"];
        if ( (cookie != null) && (cookie.IndexOf("_SessionId=") >= 0) )
        {
          //An expired session cookie still resides on this PC, so first alert user that session is expired
          AlertWarning("Session timed out due to inactivity.  Please log in again.");
        }
        filterContext.Result = RedirectToAction("LogOut", "Authentication");
      }
    }
  }

  base.OnActionExecuting(filterContext);

}
person SpicyMikey    schedule 04.11.2014

Пробовали ли вы существующий фильтр авторизации?

person 37Stars    schedule 01.07.2011
comment
Фильтр авторизации не имеет ничего общего с тайм-аутом сеанса. - person palm snow; 12.01.2012

как упоминалось выше .. попробуйте это

public class SessionExpireAttribute : ActionFilterAttribute {

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Session != null) {
            if (filterContext.HttpContext.Session.IsNewSession) {
                filterContext.Result = new RedirectResult("/");//redirect to home page
            }
        }
    }
}

а затем примените этот фильтр к действию или контроллеру [SessionExpire]

person Rady    schedule 17.07.2013