Browse Source

修复nginx部署无法获得ip的问题

xiaoxue 5 years ago
parent
commit
835510b744

+ 5 - 8
Admin.Core.Common/Auth/IUser.cs

@@ -1,26 +1,23 @@
 namespace Admin.Core.Common.Auth
 {
+    /// <summary>
+    /// 用户信息接口
+    /// </summary>
     public interface IUser
     {
         /// <summary>
         /// 主键
         /// </summary>
         long Id { get; }
-        /// <summary>
-        /// 登录日志Id
-        /// </summary>
-        long LoginLogId { get; }
+
         /// <summary>
         /// 用户名
         /// </summary>
         string Name { get; }
+
         /// <summary>
         /// 姓名
         /// </summary>
         string RealName { get; }
-        /// <summary>
-        /// IP
-        /// </summary>
-        string IP { get; }
     }
 }

+ 0 - 58
Admin.Core.Common/Auth/User.cs

@@ -65,64 +65,6 @@ namespace Admin.Core.Common.Auth
                 return "";
             }
         }
-
-        /// <summary>
-        /// 登录日志Id
-        /// </summary>
-        public long LoginLogId
-        {
-            get
-            {
-                var id = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserLoginLogId);
-                if (id != null && id.Value.NotNull())
-                {
-                    return id.Value.ToLong();
-                }
-                return 0;
-            }
-        }
-
-        /// <summary>
-        /// 用户IP
-        /// </summary>
-        public string IP
-        {
-            get
-            {
-                if (_accessor?.HttpContext?.Connection == null)
-                    return "";
-
-                return _accessor.HttpContext.Connection.RemoteIpAddress.ToString();
-            }
-        }
-
-        /// <summary>
-        /// 用户IPv4
-        /// </summary>
-        public string IPv4
-        {
-            get
-            {
-                if (_accessor?.HttpContext?.Connection == null)
-                    return "";
-
-                return _accessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
-            }
-        }
-
-        /// <summary>
-        /// 用户IPv6
-        /// </summary>
-        public string IPv6
-        {
-            get
-            {
-                if (_accessor?.HttpContext?.Connection == null)
-                    return "";
-
-                return _accessor.HttpContext.Connection.RemoteIpAddress.MapToIPv6().ToString();
-            }
-        }
     }
 
     /// <summary>

+ 43 - 0
Admin.Core.Common/Helpers/IPHelper.cs

@@ -0,0 +1,43 @@
+using System.Linq;
+using System.Text.RegularExpressions;
+using Microsoft.AspNetCore.Http;
+
+namespace Admin.Core.Common.Helpers
+{
+    public class IPHelper
+    {
+        /// <summary>
+        /// 是否为ip
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <returns></returns>
+        public static bool IsIP(string ip)
+        {
+            return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
+        }
+
+        public static string GetIP(HttpRequest request)
+        {
+            if (request == null)
+            {
+                return "";
+            }
+
+            string ip = request.Headers["X-Real-IP"].FirstOrDefault();
+            if (ip.IsNull())
+            {
+                ip = request.Headers["X-Forwarded-For"].FirstOrDefault();
+            }
+            if (ip.IsNull())
+            {
+                ip = request.HttpContext?.Connection?.RemoteIpAddress?.ToString();
+            }
+            if (ip.IsNull() || !IsIP(ip))
+            {
+                ip = "127.0.0.1";
+            }
+
+            return ip;
+        }
+    }
+}

+ 3 - 6
Admin.Core.Services/Admin/LoginLog/LoginLogService.cs

@@ -1,30 +1,27 @@
 using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
 using AutoMapper;
-using Admin.Core.Common.Auth;
 using Admin.Core.Model.Input;
 using Admin.Core.Model.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.LoginLog.Input;
 using Admin.Core.Service.Admin.LoginLog.Output;
-using Microsoft.AspNetCore.Http;
+using Admin.Core.Common.Helpers;
 
 namespace Admin.Core.Service.Admin.LoginLog
 {	
 	public class LoginLogService : ILoginLogService
     {
-        private readonly IUser _user;
         private readonly IMapper _mapper;
         private readonly IHttpContextAccessor _context;
         private readonly ILoginLogRepository _loginLogRepository;
         public LoginLogService(
-            IUser user,
             IMapper mapper,
             IHttpContextAccessor context,
             ILoginLogRepository loginLogRepository
         )
         {
-            _user = user;
             _mapper = mapper;
             _context = context;
             _loginLogRepository = loginLogRepository;
@@ -54,7 +51,7 @@ namespace Admin.Core.Service.Admin.LoginLog
         {
             var res = new ResponseOutput<long>();
 
-            input.IP = _user.IP;
+            input.IP = IPHelper.GetIP(_context?.HttpContext?.Request);
 
             string ua = _context.HttpContext.Request.Headers["User-Agent"];
             var client = UAParser.Parser.GetDefault().Parse(ua);

+ 2 - 1
Admin.Core.Services/Admin/OprationLog/OprationLogService.cs

@@ -8,6 +8,7 @@ using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.OprationLog.Input;
 using Admin.Core.Service.Admin.OprationLog.Output;
+using Admin.Core.Common.Helpers;
 
 namespace Admin.Core.Service.Admin.OprationLog
 {	
@@ -62,7 +63,7 @@ namespace Admin.Core.Service.Admin.OprationLog
             input.BrowserInfo = ua;
 
             input.RealName = _user.RealName;
-            input.IP = _user.IP;
+            input.IP = IPHelper.GetIP(_context?.HttpContext?.Request);
 
             var entity = _mapper.Map<OprationLogEntity>(input);
             var id = (await _oprationLogRepository.InsertAsync(entity)).Id;

+ 1 - 2
Admin.Core/Logs/LogHandler.cs

@@ -5,8 +5,7 @@ using Admin.Core.Model.Output;
 using Admin.Core.Service.Admin.OprationLog;
 using Admin.Core.Service.Admin.OprationLog.Input;
 using Microsoft.AspNetCore.Mvc.Filters;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
+//using Newtonsoft.Json;
 
 namespace Admin.Core.Logs
 {