2011-08-01 11 views
0

可能性の重複:
Override Authorize Attribute in ASP.NET MVCASP.NET MVCで 'オプトアウト' の認証を行う方法を

ASP.NET MVCでは、あなたが行動上の[承認]属性を追加しますそのメソッドを使用するためにユーザーを認証する必要がある(指定されたロール内で)必要があることを指定するメソッド。

これは、「オプトイン」認証のようなものです。保護したいすべての方法を飾ることを覚えていなければなりません。エラーが発生しやすいです。

ホワイトリストに記載されているコントローラや操作以外に、すべての認証に認証が必要であると指定するにはどうすればよいですか?

+1

@クリスMarisicにフィルタプロバイダを登録します。私は同意しません。リンクされた記事では、新しいAuthorize属性を作成する方法について説明します。ここでは、承認を必要としないことを指定できます。デフォルトで許可を要求する方法については説明しません。おそらく私は新しいコントローラータイプか何かが必要です。 – David

+0

@Davidあなたはその質問に従って、それをグローバルフィルタとして適用します。それからオプトアウトするアクションにのみ属性を付けます。アクション・レベル(またはコントローラー・レベル)属性は、グローバル・アクションをオーバーライドします。 –

+0

ああ、グローバルフィルタ?これは私が行方不明になっているMVC知識のパイの一部です::) – David

答えて

2

ここにの基本アイデアがあります。必要な結果を得るためには、特にコントローラー内のいくつかのアクションが許可を必要とする場合や、そうでない場合には、これを行う必要があります。 ご存知のように、asp.net mvcフレームワークのすべての部分をカスタマイズすることができます。それはそれのフィルターを提供するメカニズムです。まず、認証を提供するためのIFilterProvider実装を作成

public class AuthorizeFilterProvider : IFilterProvider 
    { 
     public List<Type> AuthorizationExcludedControllerTypes = new List<Type>(); 

     #region IFilterProvider Members 

     public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
     { 
      if (!AuthorizationExcludedControllerTypes.Contains(controllerContext.Controller.GetType())) 
      { 
       yield return new Filter(new AuthorizeAttribute(), FilterScope.Controller, null); 
//return filter only if it is not included into AuthorizationExcludedControllerTypes list. 
      } 
     } 

     #endregion 
    } 

をフィルタリングし、Global.asaxの

protected void Application_Start() 
     { 
      ... 

      AuthorizeFilterProvider authorizeFilterProvider = new AuthorizeFilterProvider(); 
      authorizeFilterProvider.AuthorizationExcludedControllerTypes.Add(typeof(HomeController)); 

      FilterProviders.Providers.Add(authorizeFilterProvider); 

      ... 

     } 
関連する問題