using System;
using System.Linq;
using System.Web;
using Hangfire;
using Masuit.MyBlogs.Core.Common;
using Masuit.MyBlogs.Core.Extensions.Hangfire;
using Masuit.Tools.Core.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Masuit.MyBlogs.Core.Extensions
{
public class FirewallAttribute : ActionFilterAttribute
{
///
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Filters.Any(m => m.ToString().Contains(nameof(AllowAccessFirewallAttribute))))
{
return;
}
string httpMethod = context.HttpContext.Request.Method;
if (httpMethod.Equals("OPTIONS", StringComparison.InvariantCultureIgnoreCase) || httpMethod.Equals("HEAD", StringComparison.InvariantCultureIgnoreCase))
{
return;
}
string ip = context.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
if (ip.IsDenyIpAddress() && string.IsNullOrEmpty(context.HttpContext.Session.Get("AccessViewToken")))
{
BackgroundJob.Enqueue(() => HangfireBackJob.InterceptLog(new IpIntercepter()
{
IP = ip,
RequestUrl = HttpUtility.UrlDecode(context.HttpContext.Request.Scheme + "://" + context.HttpContext.Request.Host + context.HttpContext.Request.Path),
Time = DateTime.Now
}));
context.Result = new RedirectToActionResult("AccessDeny", "Error", null);
return;
}
if (context.HttpContext.Request.IsRobot())
{
return;
}
try
{
var times = RedisHelper.IncrBy("Frequency:" + context.HttpContext.Session.Id);
RedisHelper.Expire("Frequency:" + context.HttpContext.Session.Id, TimeSpan.FromMinutes(1));
if (times > 300)
{
context.Result = new RedirectToActionResult("TempDeny", "Error", null);
}
}
catch
{
// ignore
}
}
}
}