自定义授权过滤器记录两次

时间:2016-05-28 20:59:03

标签: c# asp.net asp.net-mvc

我创建了一个自定义授权过滤器,其中包含一些检查。检查失败时,它正在写入日志文件。奇怪的是,每次失败都会将错误文本两次写入日志。如何确保它只记录错误一次?

    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();
            }
        }
}

1 个答案:

答案 0 :(得分:1)

假设您已在全球范围内注册了过滤器......

import java.util.Arrays;
import java.util.Random;

public class Assignment8 {
    public static void main(String[] args) {
        Random random = new Random();

        int[] storage = new int[100];    
        for (int i = 0; i < storage.length; i++) {
            storage[i] = random.nextInt(25);
        }

        System.out.println("The odd numbers are: " + "\n");

        int oddArray[] = OddNumbers(storage);
        for (int num : oddArray) {
            System.out.println(num);
        }

        System.out.println("\n" + "The even numbers are: " + "\n");

        int evenArray[] = EvenNumbers(storage);
        for (int num : evenArray) {
            System.out.println(num);
        }
    }

    public static int[] OddNumbers(int[] storage) {
        int index = 0;
        int[] result = new int[storage.length];

        for (int num : storage) {
            if (num % 2 != 0) {
                result[index++] = num;
            }
        }

        return Arrays.copyOf(result, index);
    }

    public static int[] EvenNumbers(int storage[]) {
        int index = 0;
        int[] result = new int[storage.length];

        for (int num : storage) {
            if (num % 2 == 0) {
                result[index++] = num;
            }
        }

        return Arrays.copyOf(result, index);
    }
}

原始操作运行时会触发一次。然后它将返回401未经授权。此状态由ASP.NET捕获,并将自动重定向到登录页面。加载登录页面后,您的过滤器会再次运行(并且可能会再次失败)。

为了让它停止这样做,有几个选择。

  1. 继承自public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new AuthorizationFilter()); filters.Add(new HandleErrorAttribute()); } } 而非AuthorizeAttribute。覆盖FilterAttribute, IAuthorizationFilter方法并在登录失败时返回AuthorizeCore。在登录方法(以及您不想检查的任何其他方法)上使用false属性。
  2. 构建您自己的逻辑,以检查AllowAnonymousAttribute或自定义属性。 Here is an example检查过滤器中的属性。
  3. 我建议你使用第一个选项。原因是除了自动获得AllowAnonymousAttribute的功能外,还有一些代码可以处理将输出缓存与授权结合使用。