2

ユーザー セッションがタイムアウトした場合にログオン画面へのリダイレクトを処理するために、BaseController で OnActionExecuting を使用しようとしています。ただし、ログインする前でも無限のリダイレクトが発生しています-これを回避する方法について誰かアドバイスできますか?

したがって、ベースコントローラーには次のものがあります。

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (SessionManager.Instance().GetUser() == null) 
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
                    { "Controller", "Home" },
                    { "Action", "LogOn" }
            });
        }

        base.OnActionExecuting(filterContext);
    }

基本的に、ユーザーなどを取得/設定できるSession Managerクラスがあります-LogOnが検証された後にSetUserメソッドを使用してのみ設定されるため、GetUserもnullになるという問題を知っています。

ただし、他のコントローラーのすべてのメソッドに次のようなチェックを付けるのではなく、

public ActionResult SomeOtherMethod()
{
     if(SessionManager.Instance().GetUser() != null)
     {

             //Go Do Useful View stuff

     }
     else
     {
          //Redirect To Logon
     }

}

Base Controller で OnActionExcuting を使用したいと考えています。しかし、それは LogOn ページで実行されているため (そうあるべきです)、GetUser が常に null になるため、無限にリダイレクトされますか?

これを行うより良い方法はありますか

4

1 に答える 1

3

多分あなたはこのようなことを試すことができます:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string controllerName = filterContext.Controller.GetType().Name;
    string actionName = filterContext.ActionDescriptor.ActionName;

    if (SessionManager.Instance().GetUser() == null ) 
    {
        if(!controllerName.Equals(typeof(HomeController).Name,StringComparison.InvariantCultureIgnoreCase)
        || !actionName .Equals("LogOn",StringComparison.InvariantCultureIgnoreCase)))
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
                { "Controller", "Home" },
                { "Action", "LogOn" }
        });
    }

    base.OnActionExecuting(filterContext);
}
于 2013-02-21T11:15:44.593 に答える