RequestAuditFilter.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using Microsoft.AspNetCore.Mvc.Controllers;
  2. using Microsoft.AspNetCore.Mvc.Filters;
  3. using System.Security.Claims;
  4. using System;
  5. using System.Threading.Tasks;
  6. using TEAMModelOS.SDK.Extension;
  7. using Microsoft.Extensions.Logging;
  8. using TEAMModelOS.SDK;
  9. using DocumentFormat.OpenXml.Office2010.Excel;
  10. using DocumentFormat.OpenXml.Wordprocessing;
  11. using System.IdentityModel.Tokens.Jwt;
  12. using System.Linq;
  13. using Azure.Core;
  14. using DocumentFormat.OpenXml.Office2016.Excel;
  15. using TEAMModelOS.SDK.DI;
  16. using Microsoft.Extensions.Primitives;
  17. using HTEXLib.Helpers.ShapeHelpers;
  18. namespace TEAMModelOS.Filter
  19. {
  20. public class RequestAuditFilter : IAsyncActionFilter
  21. {
  22. //private readonly ILogger _logger;
  23. private readonly HttpTrigger _httpTrigger;
  24. public RequestAuditFilter(/*ILoggerFactory loggerFactory*/HttpTrigger httpTrigger)
  25. {
  26. // _logger = loggerFactory.CreateLogger<RequestAuditFilter>();
  27. _httpTrigger = httpTrigger;
  28. }
  29. public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
  30. {
  31. //============== 这里是执行方法之前获取数据 ====================
  32. // 获取控制器、路由信息
  33. //var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
  34. // 获取请求的方法
  35. //var method = actionDescriptor.MethodInfo;
  36. // 获取 HttpContext 和 HttpRequest 对象
  37. var httpContext = context.HttpContext;
  38. var httpRequest = httpContext.Request;
  39. // 获取客户端 Ipv4 地址
  40. var remoteIPv4 = httpContext.GetRemoteIpAddressToIPv4();
  41. // 获取请求的 Url 地址
  42. // var requestUrl = httpRequest.GetRequestUrlAddress();
  43. // 获取来源 Url 地址
  44. var refererUrl = httpRequest.GetRefererUrlAddress();
  45. // 获取请求参数(写入日志,需序列化成字符串后存储)
  46. var parameters = context.ActionArguments;
  47. // 获取操作人(必须授权访问才有值)"userId" 为你存储的 claims type,jwt 授权对应的是 payload 中存储的键名
  48. //var userId = httpContext.User?.FindFirstValue("userId");
  49. var authtoken = context.HttpContext.GetXAuth("AuthToken");
  50. string tokenSha = string.Empty,client = string.Empty;
  51. if (context.HttpContext.Request.Headers.TryGetValue("Authorization", out StringValues Authorization))
  52. {
  53. try {
  54. string token = Authorization.ToString().Replace("Bearer ", "");
  55. var jwt = new JwtSecurityTokenHandler().ReadJwtToken(token);
  56. tokenSha = ShaHashHelper.GetSHA1(token);
  57. client = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("roles"))?.Value;
  58. } catch (Exception ex ) { }
  59. }
  60. string id = string.Empty, name = string.Empty, picture = string.Empty, school = string.Empty, scope = string.Empty;
  61. if (!string.IsNullOrWhiteSpace(authtoken)) {
  62. var jwt = new JwtSecurityTokenHandler().ReadJwtToken(authtoken);
  63. id = jwt.Payload.Sub;
  64. school = jwt.Payload.Azp;
  65. name = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("name"))?.Value;
  66. scope = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("scope"))?.Value;
  67. }
  68. string secChUaPlatform = string.Empty;
  69. if (httpContext.Request.Headers.TryGetValue("Sec-Ch-Ua-Platform", out var values))
  70. {
  71. secChUaPlatform = values.FirstOrDefault();
  72. }
  73. // 请求时间
  74. var requestedTime = DateTimeOffset.Now.GetGMTTime(8).ToUnixTimeMilliseconds();
  75. //============== 这里是执行方法之后获取数据 ====================
  76. var actionContext = await next();
  77. // 获取返回的结果
  78. // var returnResult = actionContext.Result;
  79. // 判断是否请求成功,没有异常就是请求成功
  80. // var isRequestSucceed = actionContext.Exception == null;
  81. // 获取调用堆栈信息,提供更加简单明了的调用和异常堆栈
  82. // var stackTrace = EnhancedStackTrace.Current();
  83. // string region = await _searcher.SearchIpAsync(remoteIPv4);
  84. //同一个账号,同一IP,同一接口,UA标识(UA标识随意切换则表示可能会存在DDOS),时间段
  85. //_logger.LogInformation(new{ ua=httpContext.GetUserAgent(), ip=remoteIPv4,time=requestedTime,path =$"{httpRequest.PathBase}{httpRequest.Path}",host= $"{httpRequest.Host}", param=parameters,id ,name ,school,succeed =isRequestSucceed }.ToJsonString());
  86. var data = new
  87. {
  88. ua = httpContext.GetUserAgent(),
  89. ip = remoteIPv4,
  90. time = requestedTime,
  91. path = $"{httpRequest.PathBase}{httpRequest.Path}",
  92. host = $"{httpRequest.Host}",
  93. param = parameters,
  94. id = id,
  95. name = name,
  96. school = school,
  97. client = client,
  98. tid = tokenSha,
  99. scope = scope,
  100. referer = refererUrl,
  101. platform = secChUaPlatform,
  102. p = "bi",
  103. };
  104. _= _httpTrigger.RequestHttpTrigger(data, "China", "http-log");
  105. }
  106. }
  107. }