Как обрабатывать время ожидания сеанса в MVC 3 - PullRequest
3 голосов
/ 30 июня 2011

У меня проблемы с частым истечением времени сеанса.

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

Ответы [ 4 ]

5 голосов
/ 30 июня 2011

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

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
                }
            }
        }
    }
}
1 голос
/ 04 ноября 2014

Здесь больше, чем кажется на первый взгляд. Вот более полное 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);

}
0 голосов
/ 17 июля 2013

как упомянуто выше .. попробуйте это

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]

0 голосов
/ 01 июля 2011

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

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