7

いくつかのコントローラーといくつかのアクションを備えた単純な ASP.Net MVC 3 アプリケーションがあります。

現在、これはユーザー ベースのアプリケーションであるため、ほとんどのコントローラー アクションではユーザーの認証が必要です。MVC は、コントローラーやアクションを個別に装飾するために使用できる組み込みの Authorize 属性を使用して、これを適切に処理します。

素晴らしいことは、属性をコントローラーだけに適用できることです。その特定のコントローラーのすべてのアクションにも適用されます-多くの入力が節約されます;)

しかし、たとえば 10 個のアクションを持つコントローラーが 1 つあります。しかし、アクションの 1 つに Authorize 属性を適用しないようにしたいと考えています。

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

事実上、次のようなものが必要になります...

[!Authorize]また[NotAuthorize]

仕事をするカスタムのものを作成できることは知っていますが、知りたいのは、これを行う組み込みの方法があるかどうかです? または、属性を他の 9 つのアクションすべてに適用する必要がありますか?

4

2 に答える 2

13

ASP.NET MVC 4.0には、まさにそれを行う新しい属性が追加されていることに注意してください:
[AllowAnonymous]

于 2012-07-12T02:02:25.700 に答える
2

Phil Haack は最近、この正確なシナリオを扱ったブログ投稿を書きました。

ASP.NET MVC 3 の条件付きフィルター

彼のソリューションには、アクション メソッドの属性にフィルター条件を指定できるようにするカスタムの「条件付きフィルター プロバイダー」を作成することが含まれます。

詳細と推論は彼の投稿にありますが、コードは比較的単純です。まず、フィルター プロバイダーを作成します。

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);
于 2011-11-03T17:48:22.420 に答える