0

アクションのリダイレクトに関連する小さな問題があります。すべてのコントローラーの基本クラスである BaseController クラスの OnActionExecuting のオーバーライドを使用して、ユーザーがサイト内の特定の領域に関する情報にアクセスできないようにしたいと考えています。メソッド本体:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Request.IsAuthenticated && (User as Eagle.Security.EaglePrincipal != null) && Session != null && Session["LastKnownGoodArea"] != null && filterContext.ActionDescriptor.ActionName != "InvalidPermission")
        {
            var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            if (currentArea != Session["LastKnownGoodArea"].ToString())
                RedirectToActionPermanent("InvalidPermission", "Account", new { target = 0, redirectURL = null as string });
            else
                base.OnActionExecuting(filterContext);
        }

    }

ただし、これは指定されたアクションにリダイレクトされません。私は何を間違っていますか?もしあれば、他にどのようなアプローチをお勧めしますか?

ありがとう、シルヴィウ

4

4 に答える 4

1

すべてのコントローラーの基本クラスであるBaseControllerクラスのOnActionExecutingのオーバーライドを使用して、ユーザーがサイトの特定の領域に関する情報にアクセスできないようにしたい。

なぜこれにOnActionExecutingを使用することを選択したのですか?すべてのリクエストでこのifステートメントを実行しているAuthorizeので、特定のアクションに属性を使用することをお勧めします。

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var user = User as Eagle.Security.EaglePrincipal;

        if(httpContext.User.Identity.IsAuthenticated && user != null)
        {
            var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            var lastKnownArea = Session["LastKnownGoodArea"];

            if (lastKnowArea == null)
               return false;

            return currentArea.Equals(lastKnownArea.ToString());
        }

        return base.AuthorizeCore(httpContext);            
    }
}

で、次のweb.configようなリダイレクトを構成できます。

 <customErrors mode="RemoteOnly">
  <error statusCode="403" redirect="/InvalidPermission/Account" />
 </customErrors>

UnAuthorizedリクエストを制御したい場合は、いつでもHandleUnauthorizedRequestメソッドをオーバーライドすることを選択できます

于 2013-02-11T14:21:37.090 に答える
1

最終的な解決策は次のとおりです。

var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            if (currentArea != Session["LastKnownGoodArea"].ToString())
            {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new
                    {
                        controller = "Account",
                        action = "InvalidPermission",
                        area = "",
                        target = 0,
                        redirectURL = ""
                    }));
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }

ご意見ありがとうございました、あなたはたくさん助けてくれました!乾杯!

于 2013-02-11T14:22:45.363 に答える
1

デイブがコメントしたことは正しいです!さらに、これはあなたが探している構文である必要があります:-

 protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (Request.IsAuthenticated && (User as Eagle.Security.EaglePrincipal != null) && Session != null && Session["LastKnownGoodArea"] != null && filterContext.ActionDescriptor.ActionName != "InvalidPermission")
            {
                var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
                if (currentArea != Session["LastKnownGoodArea"].ToString())
                {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new
                    {
                        controller = "InvalidPermission",
                        action = "Account",
                        target = 0,                                         
                    }));
                filterContext.Result.ExecuteResult(filterContext);
                }       
                else
                {
                    base.OnActionExecuting(filterContext);
                }
            }

        }
于 2013-02-11T13:58:04.173 に答える
0

アクションの結果がまだ作成されていないため、フィルタからアクションにリダイレクトできません。新しいルートしか作成できません。必要な構文が完全にはわかりません。行き方の例としてこれをまとめました。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Request.IsAuthenticated && (User as Eagle.Security.EaglePrincipal != null) && Session != null && Session["LastKnownGoodArea"] != null && filterContext.ActionDescriptor.ActionName != "InvalidPermission")
        {
            var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            if (currentArea != Session["LastKnownGoodArea"].ToString())
            filterContext.Result = new RedirectToRouteResult(
    new System.Web.Routing.RouteValueDictionary {
        {"controller", "InvalidPermission"}, {"action", "Account"}, {target =0}, {redirectURL = null as string }

            else
                base.OnActionExecuting(filterContext);
        }

    }
于 2013-02-11T13:34:52.743 に答える