2016-04-06 14 views
1

MVCアプリケーションで使用するためにカスタムAuthorizeAttributeを作成しようとしています。このタグはUsersテーブルをチェックし、そのユーザーが管理者であるかどうかを確認します。十分に簡単です。私を混乱させている何MVCカスタム承認属性の振る舞い

[AttributeUsage(AttributeTargets.All, AllowMultiple=false, Inherited = true)] 
public class AdminOnlyAttribute : AuthorizeAttribute { 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 

     using (var db = new ArtContext()) { 
      var user = db.Users 
       .Where(x => x.UserId == httpContext.User.Identity.Name) 
       .FirstOrDefault(); 

      if (user != null) 
       if (user.IsAdministrator) 
        return true; 
     } 

     return false; 
    } 
} 

は、ホームコントローラは、この属性で修飾されていない場合でも、それはまだ呼び出されて、ユーザーがUID/PWDの入力を求められている、ということです。

タグはフィルタ設定に登録されているときに実行されますか?それが私自身(一見)実行するのを防ぐ方法がありますか?

EDIT

私はフィルタはグローバルに登録していました。私はすべてのフィルターを使用する前に登録しなければならないと思ったので、この全体が私の理解に欠けていました!

public class FilterConfig { 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 
     filters.Add(new HandleErrorAttribute()); 
     //filters.Add(new AdminOnlyAttribute()); 
    } 
} 
+0

これは、設計したものに対してロールを使用しただけであれば、はるかに簡単になります。管理者ロールを作成し、管理者ロールパラメータと共に標準のAuthorize属性を使用します。これは、標準のauthorize属性がデータベースへのアクセスを行わないため、さらに優れたパフォーマンスを発揮します。 –

+0

@ErikFunkenbuschそれはもっと簡単ですが、私たちは別のアクティブなディレクトリグループに敬意を表しています。 –

答えて

1

グローバルフィルタとして登録すると、サイトのどこにでも適用されます。コントローラー/メソッドを[AllowAnonymous]属性で飾ることでオーバーライドすることができます。

+0

それはそれでした!フィルターを使用する前に、フィルターを登録しなければならないと思いました。この全面的な問題は私の理解の欠如でした!私はグローバルフィルタの設定からそれを削除し、今は期待どおりに動作しています。 –