Подтвердить что ты не робот

Как перенаправить на страницу входа в систему, когда время ожидания сеанса завершено в asp.net mvc

У меня есть приложение ASP.NET MVC4, где я реализую sessionTimeout, например:

<configuration>
  <system.web>
    <sessionState timeout="2"></sessionState>
  </system.web>
</configuration>

И при аутентификации:

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="1" />
    </authentication>
  </system.web>
</configuration>

После окончания сеанса (2 минуты) мне нужно перенаправить на страницу входа в систему, но перенаправление не происходит.

Как я могу изменить код, чтобы он перенаправлялся?

4b9b3361

Ответ 1

Один из способов: В случае окончания сеанса в каждом действии вы должны проверить его сеанс и если он равен нулю, то перенаправляйтесь на страницу входа.

Но это очень беспокойный метод Для этого вам нужно создать свой собственный ActionFilterAttribute, который сделает это, вам просто нужно добавить этот атрибут в каждый метод действий.

Вот класс, который переопределяет ActionFilterAttribute.

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

            // check if session is supported
            CurrentCustomer objCurrentCustomer = new CurrentCustomer();
            objCurrentCustomer = ((CurrentCustomer)SessionStore.GetSessionValue(SessionStore.Customer));
            if (objCurrentCustomer == null)
            {
                // check if a new session id was generated
                filterContext.Result = new RedirectResult("~/Users/Login");
                return;
            }

            base.OnActionExecuting(filterContext);
        }
    }

Затем в действии просто добавьте этот атрибут так:

[SessionExpire]
public ActionResult Index()
{
     return Index();
}

Это поможет вам.

Ответ 2

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

Короче говоря, я задерживаю сессию в _Layout за 1 минуту до и перенаправляю.

Я пытаюсь объяснить все шаг за шагом.

Если мы хотим завершить сеанс через 30 минут после и переадресовать на loginPage, выполните следующие действия:

  • Измените веб-конфигурацию следующим образом (установите 31 минуту):

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
  • Добавьте этот JavaScript в _Layout (при завершении сеанса за 1 минуту до того, как этот код сделает переадресацию, он делает время счета после последнего действия пользователя, а не первый раз на сайте)

    <script>
        //session end 
        var sessionTimeoutWarning = @Session.Timeout- 1;
    
        var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
        setTimeout('SessionEnd()', sTimeout);
    
        function SessionEnd() {
            window.location = "/Account/LogOff";
        }
    </script>
    
  • Вот мое действие LogOff, которое делает только LogOff и перенаправляет страницу входа в систему

    public ActionResult LogOff()
    {
        Session["User"] = null; //it my session variable
        Session.Clear();
        Session.Abandon();
        FormsAuthentication.SignOut(); //you write this when you use FormsAuthentication
        return RedirectToAction("Login", "Account");
    } 
    

Надеюсь, это очень полезный для вас код.

Ответ 3

Существует общее решение:

Допустим, у вас есть контроллер с именем Admin, где вы размещаете контент для авторизованных пользователей.

Затем вы можете переопределить методы Initialize или OnAuthorization контроллера администратора и написать переадресацию логина логина входа в сеанс таймаута в этих методах, как описано:

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
    {
        //lets say you set session value to a positive integer
        AdminLoginType = Convert.ToInt32(filterContext.HttpContext.Session["AdminLoginType"]);
        if (AdminLoginType == 0)
        {
            filterContext.HttpContext.Response.Redirect("~/login");
        }

        base.OnAuthorization(filterContext);
    }