Перенаправление после истечения времени ожидания сеанса в фильтре действий MVC

Мне нужно перенаправить на домашнюю страницу после тайм-аута сеанса в приложении mvc 5. Я использую следующий код:

 public class SessionExpireAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {

            var currentEnvironment = EnvironmentUtility.GetSession().Get<Environment>();
            if (currentEnvironment == null)
            {
                filterContext.Result = new RedirectResult("~/Home/Index");
            }
            base.OnActionExecuting(filterContext);
        }

    }

В контроллере у меня есть код ниже:

[SessionExpire]
public ActionResult Submit()
{
    var urlReferrer = this.Request.UrlReferrer;
    if (urlReferrer != null)
    {
     return this.Redirect(urlReferrer.ToString());
    }
    else
    {
        return View();
    }
}

После нажатия кнопки отправки страница перенаправляется на другую страницу с использованием кода javascript, как показано ниже:

 function commitButtonClickedHandler()
{
       window.location.href = "@Url.Content("~/Working/NextPage")";
}

И NextPage выглядит следующим образом:

public ActionResult NextPage()
        {
            return this.View();
        }

Каково мое требование после тайм-аута сеанса, когда вы нажимаете кнопку отправки, он должен проверять истечение сеанса. Если он просрочен, то его следует перенаправить на NextPage, как в SessionExpireAttribute. В противном случае он должен продолжить процесс. Но проблема заключается в том, что после тайм-аута сеанса страница все еще перенаправляется на действие NextPage(). Пожалуйста, помогите мне исправить это. Спасибо.


person Manoj Nayak    schedule 14.06.2016    source источник
comment
Какую аутентификацию вы используете? Аутентификация форм?   -  person Bon Macalindong    schedule 14.06.2016
comment
Я использую проверку подлинности Windows.   -  person Manoj Nayak    schedule 14.06.2016


Ответы (1)


Вы можете сделать это, переопределив OnActionExecuting, внеся некоторые изменения, как показано ниже:

public class SessionExpireAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {            
            if ( Session["SomeSession"] == null)                    
            {
                //ClearAllSessions
                GoToLoginPage(filterContext, "You Session has been expired");
                return;
            }           
    }

    private static void GoToLoginPage(ActionExecutingContext filterContext, string message)
    {
        try
        {           


          filterContext.Result = new RedirectToRouteResult(
                 new RouteValueDictionary 
            { 
                { "controller", "controllerName" }, 
                { "action", "actionName" } ,
                { "Area","" },
                { "UnauthLogin",message },

            });
            }
        }
        catch
        {
            filterContext.Result = new RedirectToRouteResult(
                   new RouteValueDictionary 
            { 
                { "controller", "controllerName" }, 
                { "action", "actionName" } ,
                { "Area","" },
                { "UnauthLogin",message },

            });
        }
    }
 }
person Pawan    schedule 14.06.2016
comment
Вам не нужна попытка/поймать настройку свойства filterContext.Result. Он не выполняется в контексте фильтра действий. - person NightOwl888; 15.06.2016
comment
Вы пропустили base.OnActionExecuting(filterContext); и вы не можете получить доступ к сеансу из фильтра действий. - person Paul Zahra; 10.11.2016