Преглед изворни кода

调整SignalR query参数使用token字段,onlineUser接口直接注入userManager,精简代码。

Ir0nMax пре 2 година
родитељ
комит
b0a76a3c22

+ 48 - 1
Admin.NET/Admin.NET.Core/Service/OAuth/HttpContextExtension.cs → Admin.NET/Admin.NET.Core/Extension/HttpContextExtension.cs

@@ -6,7 +6,7 @@
 
 using Microsoft.AspNetCore.Authentication;
 
-namespace Admin.NET.Core.Service;
+namespace Admin.NET.Core;
 
 public static class HttpContextExtension
 {
@@ -29,4 +29,51 @@ public static class HttpContextExtension
                 where string.Equals(scheme.Name, provider, StringComparison.OrdinalIgnoreCase)
                 select scheme).Any();
     }
+
+    public static string GetClientDeviceInfo(this HttpContext context)
+    {
+        ArgumentNullException.ThrowIfNull(context);
+
+        return CommonUtil.GetClientDeviceInfo(context.Request.Headers.UserAgent);
+    }
+
+    public static string GetClientBrowser(this HttpContext context)
+    {
+        ArgumentNullException.ThrowIfNull(context);
+
+        string userAgent = context.Request.Headers.UserAgent;
+        try
+        {
+            if (userAgent != null)
+            {
+                var client = Parser.GetDefault().Parse(userAgent);
+                if (client.Device.IsSpider)
+                    return "爬虫";
+                return $"{client.UA.Family} {client.UA.Major}.{client.UA.Minor} / {client.Device.Family}";
+            }
+        }
+        catch
+        { }
+        return "未知";
+    }
+
+    public static string GetClientOs(this HttpContext context)
+    {
+        ArgumentNullException.ThrowIfNull(context);
+
+        string userAgent = context.Request.Headers.UserAgent;
+        try
+        {
+            if (userAgent != null)
+            {
+                var client = Parser.GetDefault().Parse(userAgent);
+                if (client.Device.IsSpider)
+                    return "爬虫";
+                return $"{client.OS.Family} {client.OS.Major} {client.OS.Minor}";
+            }
+        }
+        catch
+        { }
+        return "未知";
+    }
 }

+ 13 - 17
Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs

@@ -17,6 +17,7 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
 {
     private const string GROUP_ONLINE = "GROUP_ONLINE_"; // 租户分组前缀
 
+    private readonly UserManager _userManager;
     private readonly SqlSugarRepository<SysOnlineUser> _sysOnlineUerRep;
     private readonly SysMessageService _sysMessageService;
     private readonly IHubContext<OnlineUserHub, IOnlineUserHub> _onlineUserHubContext;
@@ -27,13 +28,15 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
         SysMessageService sysMessageService,
         IHubContext<OnlineUserHub, IOnlineUserHub> onlineUserHubContext,
         SysCacheService sysCacheService,
-        SysConfigService sysConfigService)
+        SysConfigService sysConfigService,
+        UserManager userManager)
     {
         _sysOnlineUerRep = sysOnlineUerRep;
         _sysMessageService = sysMessageService;
         _onlineUserHubContext = onlineUserHubContext;
         _sysCacheService = sysCacheService;
         _sysConfigService = sysConfigService;
+        _userManager = userManager;
     }
 
     /// <summary>
@@ -43,23 +46,17 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
     public override async Task OnConnectedAsync()
     {
         var httpContext = Context.GetHttpContext();
-        var token = httpContext.Request.Query["access_token"];
-        var claims = JWTEncryption.ReadJwtToken(token)?.Claims;
-        var client = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]);
-
-        var userId = claims?.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value;
-        var tenantId = claims?.FirstOrDefault(u => u.Type == ClaimConst.TenantId)?.Value;
         var user = new SysOnlineUser
         {
             ConnectionId = Context.ConnectionId,
-            UserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId),
-            UserName = claims?.FirstOrDefault(u => u.Type == ClaimConst.Account)?.Value,
-            RealName = claims?.FirstOrDefault(u => u.Type == ClaimConst.RealName)?.Value,
+            UserId = _userManager.UserId,
+            UserName = _userManager.Account,
+            RealName = _userManager.RealName,
             Time = DateTime.Now,
-            Ip = httpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(),
-            Browser = client.UA.Family + client.UA.Major,
-            Os = client.OS.Family + client.OS.Major,
-            TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : Convert.ToInt64(tenantId),
+            Ip = httpContext.GetRemoteIpAddressToIPv4(true),
+            Browser = httpContext.GetClientBrowser(),
+            Os = httpContext.GetClientOs(),
+            TenantId = _userManager.TenantId,
         };
         await _sysOnlineUerRep.InsertAsync(user);
 
@@ -70,7 +67,7 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
         }
         else
         {
-            var device = (client.UA.Family + client.UA.Major + client.OS.Family + client.OS.Major).Trim();
+            var device = httpContext.GetClientDeviceInfo().Trim();
             _sysCacheService.Set(CacheConst.KeyUserOnline + user.UserId + device, user);
         }
 
@@ -98,7 +95,6 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
         if (string.IsNullOrEmpty(Context.ConnectionId)) return;
 
         var httpContext = Context.GetHttpContext();
-        var client = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]);
 
         var user = await _sysOnlineUerRep.AsQueryable().Filter("", true).FirstAsync(u => u.ConnectionId == Context.ConnectionId);
         if (user == null) return;
@@ -112,7 +108,7 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
         }
         else
         {
-            var device = (client.UA.Family + client.UA.Major + client.OS.Family + client.OS.Major).Trim();
+            var device = httpContext.GetClientDeviceInfo().Trim();
             _sysCacheService.Remove(CacheConst.KeyUserOnline + user.UserId + device);
         }
 

+ 1 - 1
Web/src/views/system/onlineUser/signalR.ts

@@ -5,7 +5,7 @@ import { getToken } from '/@/utils/axios-utils';
 // 初始化SignalR对象
 const connection = new SignalR.HubConnectionBuilder()
 	.configureLogging(SignalR.LogLevel.Information)
-	.withUrl(`${window.__env__.VITE_API_URL}/hubs/onlineUser?access_token=${getToken()}`, { transport: SignalR.HttpTransportType.WebSockets, skipNegotiation: true })
+	.withUrl(`${window.__env__.VITE_API_URL}/hubs/onlineUser?token=${getToken()}`, { transport: SignalR.HttpTransportType.WebSockets, skipNegotiation: true })
 	.withAutomaticReconnect({
 		nextRetryDelayInMilliseconds: () => {
 			return 5000; // 每5秒重连一次