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

С ASP.NET MVC перенаправление на страницу входа в систему, когда сеанс истекает

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

4b9b3361

Ответ 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] над классом или отдельными действиями.