27

でそれを渡しますACTIONNAME、コントローラ名とAREANAMEを取得し、私は以下のようなカスタムAuthorizationFilterを使用するのActionFilter属性

public class ActionAuthorizeAttribute : AuthorizeAttribute { 

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) { 

     if(!httpContext.User.Identity.IsAuthenticated) 
      return false; 

     if(IsUserExcluded()) 
      return false; 
     else 
      return IsRoleAuthorize(httpContext); 
    } 
} 

は私が持っている各アクションの先頭にこのフィルタを使用し、チェックが許可されているため、アクション名、コントローラー名、エリア名が必要です。だから、のようなAuthorizeCore()メソッドでこの名前を取得する方法はありますか?

[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)] 
public ActionResult Index() { 
    return View(); 
} 

いずれかが任意のアイデアを持っています:答えは、私は、この名前を取得し、属性のためにそれを渡すことができますどのようにしてNOの場合には、明らかに私は実際には、コントローラでViewContext.RouteData.Values["Controller"]のようなもの、手でそれぞれの名前を追加したくありませんそれについて?

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
{ 
    var rd = httpContext.Request.RequestContext.RouteData; 
    string currentAction = rd.GetRequiredString("action"); 
    string currentController = rd.GetRequiredString("controller"); 
    string currentArea = rd.Values["area"] as string; 

    ... 

} 

答えて

71

あなたはRouteDataからそれらを取得することができ

  1. は、例えば、あなたのActionAuthorizeAttributeクラスで2つの属性を定義します

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. コントローラのあなたの行動に注釈を付ける一方で、例えば、それらを指定しますカスタムフィルタ上にある場合は動作しません面積を取得

    [ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]** 
    public ActionResult Disable(int id) 
    { 
    ... 
    } 
    
+1

「あなたはRouteDataからそれらを取得することができ、」地域を取得していきます良い答え。 **今は**それは編集された、私は元に戻す。 – gdoron

+11

これはASP.NET MVC 4の場合のみ可能ですが、この領域はrd.DataTokens ["area"]にあります。 –

+0

行var rd = httpContext.Request.RequestContext.RouteDataを変更する必要があります。 〜 var rd = HttpContext.Current.Request.RequestContext.RouteData;パラメータよりも標準のものを使用するほうがよいでしょう:) –

1

顔ちょっと前に同じ問題を、私の解決策は次のとおりです:

0

は 次はないです

filterContext.RouteData.DataTokens["area"]