我创建了一个自定义授权过滤器,其中包含一些检查。检查失败时,它正在写入日志文件。奇怪的是,每次失败都会将错误文本两次写入日志。如何确保它只记录错误一次?
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 :(得分: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捕获,并将自动重定向到登录页面。加载登录页面后,您的过滤器会再次运行(并且可能会再次失败)。
为了让它停止这样做,有几个选择。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizationFilter());
filters.Add(new HandleErrorAttribute());
}
}
而非AuthorizeAttribute
。覆盖FilterAttribute, IAuthorizationFilter
方法并在登录失败时返回AuthorizeCore
。在登录方法(以及您不想检查的任何其他方法)上使用false
属性。AllowAnonymousAttribute
或自定义属性。 Here is an example检查过滤器中的属性。我建议你使用第一个选项。原因是除了自动获得AllowAnonymousAttribute
的功能外,还有一些代码可以处理将输出缓存与授权结合使用。