7

私は単純なASP.Net MVC 3アプリケーションを持っています。ASP.Net MVC 3:逆認証属性

これはユーザーベースのアプリケーションであるため、ほとんどのコントローラアクションではユーザーを認証する必要があります。 MVCは、コントローラーおよび/またはアクションを個別に装飾するために使用できるビルトインのAuthorize属性を使用してこれをうまく処理します。 、言うことができます、)

しかし、私はと1つのコントローラを持っています。保存したタイピングがたくさん -

素晴らしいところは、あなたがするだけで、コントローラおよびその特定のコントローラのすべてのアクションが、それはあまりにも適用されています属性を適用することができますです10アクション。しかし、アクションの1つにAuthorize属性が適用されないようにします。

はい、他の9に属性を適用し、コントローラから削除して、必要なものを正確に実行できます。しかし、それをコントローラに適用したままにして、アクションの1つを除外することを選択する方法はありますか?

効果的に、のような...

[!Authorize]または[NotAuthorize]

何かをしたいでしょう、私は私が仕事をするカスタム1を作成することができます知っているが、内蔵さがある場合は、私が知りたいことはあります - これを行うには?または他の9つのアクションすべてに属性を適用する必要がありますか?

答えて

2

フィル・ハークは最近、この正確なシナリオを扱うブログ記事を書いた:

Conditional Filters in ASP.NET MVC 3

彼の解決策は、1アクションの属性にフィルタ条件を指定することができますカスタム「の条件付きフィルター・プロバイダー」を書き込むことを含みます方法。

詳細と推論は彼の記事にありますが、コードは比較的単純です。それを適用し、その後

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Mvc; 

public class ConditionalFilterProvider : IFilterProvider { 
    private readonly 
    IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions; 

    public ConditionalFilterProvider(
    IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions) 
    { 

     _conditions = conditions; 
    } 

    public IEnumerable<Filter> GetFilters(
     ControllerContext controllerContext, 
     ActionDescriptor actionDescriptor) { 
    return from condition in _conditions 
      select condition(controllerContext, actionDescriptor) into filter 
      where filter != null 
      select new Filter(filter, FilterScope.Global, null); 
    } 
} 

そして:まず、フィルタプロバイダを作成

IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions = 
    new Func<ControllerContext, ActionDescriptor, object>[] { 

    (c, a) => c.Controller.GetType() != typeof(HomeController) ? 
     new MyFilter() : null, 
    (c, a) => a.ActionName.StartsWith("About") ? new SomeFilter() : null 
}; 

var provider = new ConditionalFilterProvider(conditions); 
FilterProviders.Providers.Add(provider); 
10

注意を新しい属性は、ASP.NET MVCに追加されたことを正確に行い4.0
[AllowAnonymous]