2009-08-27 8 views
10

セッション値に基づいてコントローラアクションへのアクセスを許可する新しいアクションフィルタ([Authorize]と同様の属性)を作成しました。しかし、私は基本的にすべてのコントローラのアクションをその属性で装飾しています(ごくわずかです)。すべてのコントローラアクション(C#/ ASP.NET MVC)でアクションフィルタを適用

だから、私はアクションフィルタを持っている方が良いだろうと思っ常に私はコントローラのアクションに[ExemptFromAuthorize]属性を付ける場合は除くを実行しますか? (多分私自身のControllerクラスを継承して)?

どうすればいいですか?

+0

この質問は古いですが、MVC4にはAllowAnonymousという新しい属性があります'これのために特別に作られた。 – Omar

答えて

6

jeef3の回答では、これを思いついた。複数の区切られたアクションのように、より多くのエラーチェックと堅牢性を使用できますが、一般的な考え方が有効です。

特定のケースでは、セッション値をテストして承認からも戻ってくることができます。

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute 
{ 
    public string Exemption { get; set; } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.RouteData.GetRequiredString("action") == Exemption) 
      return; 

     base.OnAuthorization(filterContext); 
    } 

} 

使用法:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")] 
public class AdminController : Controller 
... 
2

あなたは、私はクラスレベル属性から具体的な方法を除外するのか分からない、それはそのクラス内のすべてのメソッドに

[Authenticate] 
public class AccountController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

を適用させるクラスに属性を追加することができます。おそらく、認証されていないリクエストに別のコントローラを使用していますか?

+0

別のコントローラを作ることは私のコードをスパゲッティ化するでしょう...クラスレベルの属性から特定のメソッドを除いて、私は必要なものになります。 – Alex

3

あなたの最初の属性にExceptプロパティを追加しようとしましたか?

[MyAuthenticate(Exempt="View")] 
public class MyController : Controller 
{ 
    public ActionResult Edit() 
    { 
     // Protected 
    } 

    public ActionResult View() 
    { 
     // Accessible by all 
    } 
} 
+0

アクションフィルタのロジックはどのように機能しますか? (実際に「免除」作業をしていますか? – Alex

7

がCodeProjectの上の私の記事をチェックアウト - この記事で

http://www.codeproject.com/KB/web-security/AuthorizeWithExemptions.aspx

を、私はASP.NET MVCを確保するためのソリューションを提供しますアプリケーションのコントローラは、あなたが安全でないと定義したものを除き、すべてのアクションが保護されるようにします。コードから

snipper:2013+でこれを読んで、誰のために

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    ActionDescriptor action = filterContext.ActionDescriptor; 
    bool IsUnsecured = action.GetCustomAttributes(
         typeof(UnsecuredActionAttribute), true).Count() > 0; 

    //If doesn't have UnsecuredActionAttribute - then do the authorization 
    filterContext.HttpContext.SkipAuthorization = IsUnsecured; 

    base.OnAuthorization(filterContext); 
} 
+1

これは私が提案しようとしていたものです。 –

0

、MVC4は今、あなたは、コントローラ上の承認を入れ、その後、任意の機能に匿名を許可することができます[AllowAnonymous]

の使用をサポートしていますあなたは承認したくありません。

例:

[Authorize] 
public class HomeController : Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Index() 
    { 

    } 
} 
6

私は質問はかなり時代遅れであることを理解とにかくあなたはすべてのアクションにフィルタを適用したい場合は...ただ、グローバルに以下の行を追加します。asax:

protected void Application_Start() 
{ 
    // your code here and then 
    RegisterGlobalFilters(GlobalFilters.Filters); 
}  

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new MyActionFilterAttribute()); 
} 

とアクションフィルタであなただけのアクションが方法は次のいずれかの他の属性があるかどうかを確認することができます:2013+でこれを読んで、誰のために

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false)) 
    { 
     // do what you want to do 
    } 
} 
+0

ActionDescriptorは現在 "IsDefined"を定義していません。 – hallizh

+0

質問タイトルの質問のためにこれに来る人のために、これの最初の部分は、すべてのコントローラアクションでアクションフィルタを実行する方法に対する実際の答えです。 –

1

を、MVC4は今の使用をサポートしています [AllowAnonymous]

コントローラーに[Authorize]を入力してから、[ ]に許可したくない機能を[匿名で許可]することができます。

例:

[オーソライズ] パブリッククラスにHomeController:コントローラ{

[AllowAnonymous] 
public ActionResult Index() 
{ 

} 

}

この作業は、カスタム[MyAuthorize】フィルタとなるか、それだけで動作しません[Authorize]

+0

[MyAuthorize]をAuthorizeAttributeから派生させた場合、[AllowAnonymous]が動作します。 – Gh61

関連する問題