Я использую ASP.NET MVC. Я хочу перенаправить на страницу входа в систему, когда сеанс истекает. Как я могу это достичь? Если я выполняю вызов AJAX для метода в контроллере, то, если мой сеанс истекает в этой ситуации, я также хочу перенаправить на страницу входа.
С ASP.NET MVC перенаправление на страницу входа в систему, когда сеанс истекает
Ответ 1
вы можете сделать это тремя способами:
-
Создайте фильтр для своих действий и примените его для программирования кода в OnActionExecuting (до того, как действие было выполнено), http://www.asp.net/mvc/tutorials/understanding-action-filters-cs
-
Создайте базовый класс (наследующий от класса Controller) и сделайте ваши контроллеры наследуемыми от этого. В этом классе вы можете перезаписать метод OnActionExecuting, например фильтр.
-
Не используйте Session для проверки подлинности, вы можете использовать аутентификацию Forms и держать ее простой в использовании, посмотрите: http://weblogs.asp.net/fredriknormen/archive/2008/02/07/asp-net-mvc-framework-using-forms-authentication.aspx
На мой взгляд, решение 3 лучше, чем другое. Надеюсь, это сработает для вас!
Ответ 2
так как можно скопировать файл cookie для проверки подлинности с использованием форм, использовать его для имитации зарегистрированного пользователя. Я использую следующий атрибут, чтобы связать аутентификацию с текущим временем жизни сеанса.
Чтобы выполнить работу с атрибутом, вы должны установить сеанс [ "user" ] = MyUser при входе в систему и вызвать session.abandom() при выходе из системы. Я не знаю, работает ли перенаправление с помощью вызовов ajax - что-то, что вы должны попробовать.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class CheckUserSessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpSessionStateBase session = filterContext.HttpContext.Session;
var user = session["User"];
if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession))
{
//send them off to the login page
var url = new UrlHelper(filterContext.RequestContext);
var loginUrl = url.Content("~/Account/LogOff");
session.RemoveAll();
session.Clear();
session.Abandon();
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
}
}
Ответ 3
Эти ответы в значительной степени основаны на Michaels, за исключением того, что они работают; -)
Я изменил его, чтобы принять делегата для проверки завершения сеанса, чтобы он мог работать в разных приложениях, которые могут иметь разные способы определения этого, а также страницу входа в систему могут отличаться в других приложениях. В приложении Global.asax.cs Application_Start() код, который у меня есть в моем приложении,
CheckUserSessionAttribute.CheckSessionAlive = session => (session.GetUser() != null);
CheckUserSessionAttribute.LoginUrl = "~/Account/Login";
Тогда класс атрибута выглядит следующим образом
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class CheckUserSessionAttribute : ActionFilterAttribute
{
public static String LoginUrl { get; set; }
public delegate bool CheckSessionDelegate(HttpSessionStateBase session);
public static CheckSessionDelegate CheckSessionAlive;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpSessionStateBase session = filterContext.HttpContext.Session;
if ((CheckSessionAlive == null) || (CheckSessionAlive(session)))
return;
//send them off to the login page
var url = new UrlHelper(filterContext.RequestContext);
var loginUrl = url.Content(LoginUrl);
session.RemoveAll();
session.Clear();
session.Abandon();
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.HttpContext.Response.Redirect(loginUrl, false);
filterContext.Result = new EmptyResult();
}
}
С вашего контроллера просто добавьте атрибут [CheckUserSession] над классом или отдельными действиями.
Ответ 4
Здесь можно найти другое правдоподобное решение:
Переопределение методов контроллера для обработки времени ожидания сеанса