Как перенаправить на страницу входа в систему, когда время ожидания сеанса завершено в 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 минуты) мне нужно перенаправить на страницу входа в систему, но перенаправление не происходит.
Как я могу изменить код, чтобы он перенаправлялся?
Ответы
Ответ 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);
}