2016-05-28 9 views
0

いくつかのチェックを入れてカスタム認証フィルタを作成しました。チェックが失敗すると、ログファイルに書き込まれます。奇妙なことは、毎回失敗すると、エラーテキストをログに2回書き込むということです。一度エラーをログに記録する方法を確認するには?カスタム認証フィルタのログを2回

public class AuthorizationFilter : FilterAttribute, IAuthorizationFilter 
    { 
     public void OnAuthorization(AuthorizationContext filterContext) 
     { 

      var key = “wrong key”; 

      if (key != “correct key”) 
      { 
       DateTime DateTime = filterContext.HttpContext.Timestamp; 
       string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Logs\log.txt"); 

       using (StreamWriter sw = File.AppendText(path)) 
       { 
        sw.WriteLine(DateTime + “| error XYZ”); 
       } 

       filterContext.Result = new HttpUnauthorizedResult(); 
      } 
     } 
} 
+0

おそらく、フィルタを何とか2回登録している可能性があります。 – Evk

答えて

1

オリジナルのアクションが実行されると、それは一度発生します

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new AuthorizationFilter()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
} 

...あなたはフィルタがグローバルに登録していと仮定。それから無許可の401を返します。このステータスはASP.NETによって捕捉され、自動的にログインページにリダイレクトされます。ログインページが読み込まれると、フィルタが再度実行されます(おそらくはもう一度失敗します)。

これをやめるには、いくつかのオプションがあります。

  1. FilterAttribute, IAuthorizationFilterの代わりにAuthorizeAttributeを継承します。 AuthorizeCoreメソッドをオーバーライドし、ログインに失敗するとfalseを返します。ログイン方法(および確認したくないその他の方法)にはAllowAnonymousAttribute属性を使用してください。
  2. AllowAnonymousAttributeまたはカスタム属性を確認するために独自のロジックを構築します。 Here is an exampleフィルタ内の属性をチェックします。

最初のオプションを使用することをお勧めします。その理由は、AllowAnonymousAttributeの機能を自動的に取得するだけでなく、出力キャッシュを承認と組み合わせて使用​​するためのいくつかのコードもあります。