2013-03-27 6 views
6

私のfilterConfigでは、グローバルな属性フィルタを登録しました。MVCで1つの方法でグローバルフィルタをオーバーライド

ただし、異なる認可フィルタ属性を適用する特定の方法があります。もし可能であれば、これをどのように達成するのでしょうか?

注:リクエストに許可が必要なので、[AllowAnonymous]属性(フィルタにはシームレスで完全に無視されます)は使用しません。

+0

私はフィルタを扱っていませんが、これは動作しますか? http://msdn.microsoft.com/en-us/library/b6x6shw7(v=vs.71).aspx場所の要素を使用して、いくつかのページで承認をバイパスします。 – Pete

答えて

4

属性クラスのAttributeUsage属性にAllowMultiple = trueを設定して複数を許可するようにフィルタを変更し、フィルタが複数回存在する場合は、グローバルに適用される実行されません。 OnActionExecuting()に渡されるActionExecutingContextは、filterContext.ActionDescriptor.GetCustomAttributes()で適用されるフィルタを取得できるので、ここで使用できます。

次に、どの認証方法を使用するかを決定するためのパラメータ(おそらくenum)を渡すことができるようにコンストラクタを変更します。そのパラメータに通常の認証方法を選択するデフォルト値を指定します。次に、別のauthメソッドを必要とするその1つのメソッドでは、パラメーターの別の値をフィルターに適用できます。だから、このようになるかもしれません:

public class CustomAuthAttribute : AuthorizeAttribute 
{ 
    public CustomAuthAttribute(AuthMethod method = AuthMethod.StandardAuth) 
    { 
     //stuff 
    } 
} 

[CustomAuth(AuthMethod.WeirdAuth)] 
public ActionResult MethodThatNeedsDifferentAuth() 
{ 
    //stuff 
} 
+0

作成した元のCustomAttributeを変更せずにこれを行う方法はありますか? – badazzhindu

+0

それでも値を渡すことができるでしょうか? Erm ...まあ、元のバージョンを継承して追加のコンストラクタを追加してから、ベースバージョンからメソッドをオーバーライドし、ある認証メソッドか他のメソッドを選択するロジックを実行してから、あなたが 'base.Authorize()'またはそれがどちらのメソッドであっても呼ぶことができる元のバージョンからの論理。 – anaximander

+0

@anaximanderグローバルに適用されたものが実行されないように、チェックをチェックする方法に関するコードを投稿できますか –

2

あなたはAUTHORIZE属性の独自のバージョンを作成し、どのような行動に依存して、特定のパラメータを渡すことができますあなたは、たとえば

public class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 
     public string currentAction { get; set; } 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (currentAction != "notallowed") 
      { 
       HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    } 

protected override void HandleUnauthorizedRequest(AuthorizationContext context) 
    { 
     context.Result = new RedirectResult("/home/login"); 
    } 

を行い、その後、あなたのクラスやアクション

にそれを適用するために、あなたの属性をしたいと思います
+0

Web API 2でこれを使用しますが、コントローラに[OverrideAuthorizationAttribute]を追加する必要がありました。 –

関連する問題