diff --git a/src/InterfaceForward.Application/Filters/ForwardAuthorizeFilter.cs b/src/InterfaceForward.Application/Filters/ForwardAuthorizeFilter.cs index 7f983e3..499f694 100644 --- a/src/InterfaceForward.Application/Filters/ForwardAuthorizeFilter.cs +++ b/src/InterfaceForward.Application/Filters/ForwardAuthorizeFilter.cs @@ -14,7 +14,7 @@ namespace InterfaceForward.Application.Filters; public class ForwardAuthorizeFilter( InterfaceForwardQuery interfaceForwardQuery, ILogRepository logRepository, - IHttpClientInfoProvider httpClientInfoProvider, + NetUtil netUtil, IBasicRepository interfaceRepository) : IAsyncActionFilter { @@ -28,7 +28,7 @@ public class ForwardAuthorizeFilter( log.IsApp = true; - log.ClientIP = httpClientInfoProvider.ClientIpAddress; + log.ClientIP = netUtil.Ip; log.Address = httpContext.Request.GetDisplayUrl(); // body diff --git a/src/InterfaceForward.Application/Filters/NetUtil.cs b/src/InterfaceForward.Application/Filters/NetUtil.cs new file mode 100644 index 0000000..60188bc --- /dev/null +++ b/src/InterfaceForward.Application/Filters/NetUtil.cs @@ -0,0 +1,66 @@ +using System.Net; +using System.Net.Sockets; +using Fake.DependencyInjection; +using Microsoft.AspNetCore.Http; + +namespace InterfaceForward.Application.Filters; + +public class NetUtil(IHttpContextAccessor httpContextAccessor) : ITransientDependency +{ + /// 获取Ip + public string Ip + { + get + { + string ip = string.Empty; + if (httpContextAccessor.HttpContext != null) + ip = GetWebClientIp(); + if (string.IsNullOrEmpty(ip)) + ip = NetUtil.GetLanIp(); + return ip; + } + } + + /// 得到客户端IP地址 + /// + private string GetWebClientIp() + { + foreach (string hostNameOrAddress in GetWebRemoteIp().Split(',')) + { + foreach (IPAddress hostAddress in Dns.GetHostAddresses(hostNameOrAddress)) + { + if (hostAddress.AddressFamily == AddressFamily.InterNetwork) + return hostAddress.ToString(); + } + } + + return string.Empty; + } + + /// 得到局域网IP地址 + /// + public static string GetLanIp() + { + foreach (IPAddress hostAddress in Dns.GetHostAddresses(Dns.GetHostName())) + { + if (hostAddress.AddressFamily == AddressFamily.InterNetwork) + return hostAddress.ToString(); + } + + return string.Empty; + } + + /// 得到远程Ip地址 + /// + private string GetWebRemoteIp() + { + if (httpContextAccessor.HttpContext?.Connection.RemoteIpAddress == null) + return string.Empty; + string webRemoteIp = httpContextAccessor.HttpContext?.Connection.RemoteIpAddress.ToString(); + if (httpContextAccessor.HttpContext!.Request.Headers.ContainsKey("X-Real-IP")) + webRemoteIp = httpContextAccessor.HttpContext.Request.Headers["X-Real-IP"].ToString(); + if (httpContextAccessor.HttpContext.Request.Headers.ContainsKey("X-Forwarded-For")) + webRemoteIp = httpContextAccessor.HttpContext.Request.Headers["X-Forwarded-For"].ToString(); + return webRemoteIp; + } +} \ No newline at end of file