2016-09-15 8 views
0

現在、MVC Webページはセッション変数を使用して認証されています。私はカスタムAuthorizeAttributeを使用できるようにしようとしたかったので、[CustomAuth]でコントローラを飾ることができました。カスタムAuthorizeAttributeからアクション結果にリダイレクトする方法

現在、RedirectToRouteResultが「このページは表示できません」ページに移動しています。コードは、最初のRedirectToRouteResultに当たっています。

私はそれが私が持っているログインページに指示する取得方法にRedirectResult

を使用する場合、それは同じことをしますか?

この

は私が[customAuth]の代わりに、すべてのコントローラにすべてのアクションでこれを入れて持つのコントローラとアクションに使用したい私のcustomAuth

public class CustomAuth : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Session["isAuth"] != null) 
     { 
      if (!(bool)filterContext.RequestContext.HttpContext.Session["isAuth"]) 
      { 

       filterContext.Result = new RedirectToRouteResult(new 
        RouteValueDictionary(new { controller = "Base", action = "Login" })); 
      } 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
       RouteValueDictionary(new { controller = "Base", action = "Login" })); 
     } 
    } 
} 

編集---

ある

if (Session["isAuth"] != null) 
     { 
      if (!(bool)Session["isAuth"]) 
      { 
       Session.Clear(); 
       return RedirectToAction("Login", "Base"); 
      } 
     } 
     else return RedirectToAction("Login", "Base"); 

匿名認証でこれを行う方法はありますか?

+0

に登録ザ・ – Luke

+0

base/Login、アクションの_Loginを置くと、http:// localhost:/ Base/_Loginにリソースが見つかりませんページが見つかりません。これは_Loginが存在しないためです。しかし、ベース/ログインを置くと、リダイレクトされないだけでページページを表示できないことが示されます。 – user1314413

+0

/base/loginにナビゲートできますか?また、あなたのコントローラは実際に 'BaseController'と呼ばれていますか? – Luke

答えて

0

ここでは、HandleErrorAttributeから派生した属性を使用してこの処理を行っています。

新しいViewResultにfilterContent.Resultを割り当てて、宛先を設定するだけです。あなたがそれらを必要とする場合、他のプロパティを忘れないでください。

public class HandleUnauthorizedAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     base.OnException(filterContext); 

     if (filterContext.Exception.GetType() != typeof (SecurityException)) return; 

     var controllerName = (string) filterContext.RouteData.Values["controller"]; 
     var actionName = (string) filterContext.RouteData.Values["action"]; 
     var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 

     filterContext.Result = new ViewResult 
     { 
      ViewName = "Unauthorized", 
      ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
      TempData = filterContext.Controller.TempData 
     }; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 403; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
    } 
} 

私はちょうどあなたのログインページへのパスは何ですか?FilterConfig.cs

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleUnauthorizedAttribute()); 
    } 
} 
+0

あなたのコントローラは[HandleUnauthorizedAttribute]で装飾されていますか、そのカスタム例外を投げていますか? – user1314413

+0

どのバージョンのmvcを使用していますか? mvc 5の登録コードを答えに追加しました。これにより、すべての要求にフィルタが適用されます。しかし、あなたがしたい場合は、コントローラまたはアクションに入れることができます。 – Fran

+0

あなたは認証と承認を混乱させると思います。あなたが行っていることすべてが、ユーザが認証されているかどうかを確認することであれば、web.configで設定し、認証されていないユーザをログインURLに送ることができます。 – Fran

関連する問題