FirewallAttribute.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.Linq;
  3. using System.Web;
  4. using Hangfire;
  5. using Masuit.MyBlogs.Core.Common;
  6. using Masuit.MyBlogs.Core.Extensions.Hangfire;
  7. using Masuit.Tools.Core.Net;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.AspNetCore.Mvc.Filters;
  10. namespace Masuit.MyBlogs.Core.Extensions
  11. {
  12. public class FirewallAttribute : ActionFilterAttribute
  13. {
  14. /// <inheritdoc />
  15. public override void OnActionExecuting(ActionExecutingContext context)
  16. {
  17. if (context.Filters.Any(m => m.ToString().Contains(nameof(AllowAccessFirewallAttribute))))
  18. {
  19. return;
  20. }
  21. string httpMethod = context.HttpContext.Request.Method;
  22. if (httpMethod.Equals("OPTIONS", StringComparison.InvariantCultureIgnoreCase) || httpMethod.Equals("HEAD", StringComparison.InvariantCultureIgnoreCase))
  23. {
  24. return;
  25. }
  26. string ip = context.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
  27. if (ip.IsDenyIpAddress() && string.IsNullOrEmpty(context.HttpContext.Session.Get<string>("AccessViewToken")))
  28. {
  29. BackgroundJob.Enqueue(() => HangfireBackJob.InterceptLog(new IpIntercepter()
  30. {
  31. IP = ip,
  32. RequestUrl = HttpUtility.UrlDecode(context.HttpContext.Request.Scheme + "://" + context.HttpContext.Request.Host + context.HttpContext.Request.Path),
  33. Time = DateTime.Now
  34. }));
  35. context.Result = new RedirectToActionResult("AccessDeny", "Error", null);
  36. return;
  37. }
  38. if (context.HttpContext.Request.IsRobot())
  39. {
  40. return;
  41. }
  42. try
  43. {
  44. var times = RedisHelper.IncrBy("Frequency:" + context.HttpContext.Session.Id);
  45. RedisHelper.Expire("Frequency:" + context.HttpContext.Session.Id, TimeSpan.FromMinutes(1));
  46. if (times > 300)
  47. {
  48. context.Result = new RedirectToActionResult("TempDeny", "Error", null);
  49. }
  50. }
  51. catch
  52. {
  53. // ignore
  54. }
  55. }
  56. }
  57. }