leiy 1 anno fa
parent
commit
19d920ec4a

+ 7 - 2
OASystem/OASystem.Api/Controllers/AuthController.cs

@@ -18,6 +18,7 @@ using Microsoft.AspNetCore.SignalR;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using static OASystem.API.OAMethodLib.Hub.Hubs.ChatHub;
+using static OASystem.API.OAMethodLib.JWTHelper;
 
 namespace OASystem.API.Controllers
 {
@@ -72,12 +73,14 @@ namespace OASystem.API.Controllers
             #endregion
             Result authData = null;
             string uName = string.Empty;
+            string role = string.Empty;
             int uId = 0;
             int unReadCount = 0;
             if (userData.Data != null)
             {
                 uId = (userData.Data as UserLoginInfoView).UserId;
                 uName = (userData.Data as UserLoginInfoView).CnName;
+                role = (userData.Data as UserLoginInfoView).JobName;
                 authData = _SystemMenuPermissionRepository.QueryMenuLoad(uId, dto.PortType);
                 unReadCount = await _messageRep.GetUnReadCount(uId);
             }
@@ -103,7 +106,8 @@ namespace OASystem.API.Controllers
 
                 if (expDt >= createZebraTime)  //超时重新获取token
                 {
-                    authorToken = await GeneralMethod.GetToken(_config, dto.Number, uId,uName, createZebraTime);
+                    //authorToken = await GeneralMethod.GetToken(_config, dto.Number, uId,uName, createZebraTime);
+                    authorToken = await JwtHelper.IssueJwtAsync(new TokenModelJwt() { UserId = uId, UserName = uName,Role = role }); //
                 }
 
                 view.Expires = expDt;
@@ -112,7 +116,8 @@ namespace OASystem.API.Controllers
             else
             {
                 view.Expires = createZebraTime.AddMinutes(30);
-                view.Token = await GeneralMethod.GetToken(_config, dto.Number, uId, uName, createZebraTime);
+                //view.Token = await GeneralMethod.GetToken(_config, dto.Number, uId, uName, createZebraTime); //JwtHelper
+                view.Token = await JwtHelper.IssueJwtAsync(new TokenModelJwt (){ UserId = uId,UserName = uName,Role = role }); //
                 TimeSpan ts = view.Expires.AddMinutes(-1) - createZebraTime; //设置redis 过期时间 比 jwt 时间 快一分钟
                 await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>(authorId, view.Token, ts);//string 存
 

+ 4 - 0
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -509,6 +509,10 @@ namespace OASystem.API.Controllers
                     diId = groupData.Data;
                     GeneralMethod.PostGroupRateAddInit(dto.UserId, diId);
                 }
+                else if(dto.Status == 2)
+                {
+                    diId = dto.Id;
+                }
 
                 return Ok(JsonView(true,"操作成功!", diId));
             }

+ 3 - 3
OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs

@@ -111,10 +111,10 @@ namespace OASystem.API.OAMethodLib
                 expires: exp,
                 signingCredentials: creds);
 
-            //var indentity = new ClaimsIdentity(claims, "formlogin");
-            //var principal = new ClaimsPrincipal(indentity);
+            var indentity = new ClaimsIdentity(claims, "formlogin");
+            var principal = new ClaimsPrincipal(indentity);
 
-            // await _httpContext.SignInAsync (CookieAuthenticationDefaults.AuthenticationScheme, principal);
+             await _httpContext.SignInAsync (CookieAuthenticationDefaults.AuthenticationScheme, principal);
 
 
 

+ 31 - 18
OASystem/OASystem.Api/OAMethodLib/JwtHelper.cs

@@ -1,4 +1,9 @@
-using SqlSugar.Extensions;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Http;
+using OASystem.API.OAMethodLib.JuHeAPI;
+using OASystem.Domain.Dtos.Business;
+using SqlSugar.Extensions;
 using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
 
@@ -9,17 +14,19 @@ namespace OASystem.API.OAMethodLib
         public class JwtHelper
         {
 
+
+            private readonly static IHttpContextAccessor _httpContextAccessor = AutofacIocManager.Instance.GetService<IHttpContextAccessor>();
             /// <summary>
             /// 颁发JWT字符串
             /// </summary>
             /// <param name="tokenModel"></param>
             /// <returns></returns>
-            public static string IssueJwt(TokenModelJwt tokenModel)
+            public static async Task<string> IssueJwtAsync(TokenModelJwt tokenModel)
             {
                 //  appsettign.json 操作类
-                string iss = "Issuer";
-                string aud = "Audience";
-                string secret = "Audience";
+                string iss = "OASystem.com";
+                string aud = "OASystem.com";
+                string secret = AppSettingsHelper.Get("JwtSecurityKey");
 
                 var claims = new List<Claim>
               {
@@ -29,11 +36,12 @@ namespace OASystem.API.OAMethodLib
                    2、你也可以研究下 HttpContext.User.Claims ,具体的你可以看看 Policys/PermissionHandler.cs 类中是如何使用的。
                  */                
 
-                new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ToString()),
+                new Claim(JwtRegisteredClaimNames.Jti, tokenModel.UserId.ToString()),
+                new Claim(JwtRegisteredClaimNames.GivenName, tokenModel.UserName),
                 new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
                 new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
                 //这个就是过期时间,目前是过期7200秒,可自定义,注意JWT有自己的缓冲过期时间
-                new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(7200)).ToUnixTimeSeconds()}"),
+                new Claim(JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(7200)).ToUnixTimeSeconds()}"),
                 new Claim(JwtRegisteredClaimNames.Iss,iss),
                 new Claim(JwtRegisteredClaimNames.Aud,aud),
                 
@@ -55,6 +63,12 @@ namespace OASystem.API.OAMethodLib
                     //,expires:DateTime.Now.AddMinutes(1)
                     );
 
+               // var indentity = new ClaimsIdentity(claims, "FMGJ-OASystem");
+               // var principal = new ClaimsPrincipal(indentity);
+
+               //await _httpContextAccessor.HttpContext?.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
+                
+
                 var jwtHandler = new JwtSecurityTokenHandler();
                 var encodedJwt = jwtHandler.WriteToken(jwt);
 
@@ -70,10 +84,11 @@ namespace OASystem.API.OAMethodLib
             {
                 var jwtHandler = new JwtSecurityTokenHandler();
                 JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);
-                object role;
+                object role,userName;
                 try
                 {
                     jwtToken.Payload.TryGetValue(ClaimTypes.Role, out role);
+                    jwtToken.Payload.TryGetValue(ClaimTypes.GivenName, out userName);
                 }
                 catch (Exception e)
                 {
@@ -82,7 +97,8 @@ namespace OASystem.API.OAMethodLib
                 }
                 var tm = new TokenModelJwt
                 {
-                    Uid = (jwtToken.Id).ObjToInt(),
+                    UserId = (jwtToken.Id).ObjToInt(),
+                    UserName = userName != null ? userName.ObjToString() : "",
                     Role = role != null ? role.ObjToString() : "",
                 };
                 return tm;
@@ -97,20 +113,17 @@ namespace OASystem.API.OAMethodLib
             /// <summary>
             /// Id
             /// </summary>
-            public long Uid { get; set; }
+            public int UserId { get; set; }
 
             public string UserName { get; set; }
 
+            public string Role { get; set; } = "Admin";
+
             /// <summary>
-            /// 角色
-            /// </summary>
-            public string Role { get; set; }
-            /// <summary>
-            /// 职能
+            /// 过期时间,默认过期7200秒
+            /// 注意JWT有自己的缓冲过期时间
             /// </summary>
-            public string Work { get; set; }
-
-
+            public int ExpirationTime { get; set; } = 7200;
 
         }
     }

+ 16 - 0
OASystem/OASystem.Api/OAMethodLib/SignalR/HubClients/IChatClient.cs

@@ -11,5 +11,21 @@
         Task SendMessageByUser(object message);
 
         Task SendCustomUserMessage(object message);
+
+        /// <summary>
+        /// 发送消息给指定用户(系统)
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        Task SendSystemToUser(string id, string message);
+
+        /// <summary>
+        /// 发送消息给所有用户(系统)
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        Task SendSystemToAllUser(string message);
     }
 }

+ 1 - 0
OASystem/OASystem.Api/OAMethodLib/SignalR/HubService/CommonService.cs

@@ -15,5 +15,6 @@
         }
 
 
+
     }
 }

+ 51 - 5
OASystem/OASystem.Api/OAMethodLib/SignalR/Hubs/ChatHub.cs

@@ -1,8 +1,11 @@
 using Microsoft.AspNetCore.SignalR;
+using NPOI.SS.Formula.Functions;
 using OASystem.API.OAMethodLib.Hub;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.SignalR.Hubs;
 using OASystem.API.OAMethodLib.SignalR.HubService;
+using Quartz;
+using SqlSugar.DistributedSystem.Snowflake;
 using System.DirectoryServices.Protocols;
 using System.Text.RegularExpressions;
 using static OASystem.API.OAMethodLib.Hub.Hubs.ChatHub;
@@ -10,6 +13,7 @@ using static OASystem.API.OAMethodLib.JWTHelper;
 
 namespace OASystem.API.OAMethodLib.Hub.Hubs
 {
+    [Authorize]
     public class ChatHub : Hub<IChatClient>
     {
         private readonly ILogger<ChatHub> _logger;
@@ -33,6 +37,8 @@ namespace OASystem.API.OAMethodLib.Hub.Hubs
         {
             string connid = Context.ConnectionId;
             string result = $"[{connid}]";
+            string userId1 = Context.UserIdentifier;
+
             if (!UserStore.OnlineUser.Exists(u => u.ConnectionId == connid))
             {
                 result += "上线成功!" ;
@@ -52,9 +58,35 @@ namespace OASystem.API.OAMethodLib.Hub.Hubs
         /// <returns></returns>
         public override Task OnConnectedAsync()
         {
-            var connid = Context.ConnectionId;
-            _logger.LogInformation($"Client ConnectionId=> [[{connid}]] Already Connection Server!");
-            
+            var httpContext = Context.GetHttpContext();
+
+            if (httpContext != null)
+            {
+                string token = httpContext.Request.Headers["Authorization"]; // 根据实际情况修改 header key
+
+                // 处理 token...
+                if (!string.IsNullOrEmpty(token))
+                {
+                    TokenModelJwt tokenModelJwt = JwtHelper.SerializeJwt(token.ToString().Split(" ")[1]);
+                    string result = "";
+                    if (tokenModelJwt != null)
+                    {
+                        var connId = Context.ConnectionId;
+
+                        UserStore.OnlineUser.Add(new UserModel() { UserId = tokenModelJwt.UserId, ConnectionId = connId, GroupName = "FMGJ-OASystem" });
+
+                        _logger.LogInformation($"Client ConnectionId=> [[{connId}]] UserId=> [[{tokenModelJwt.UserId}]] Already Connection Server!");
+
+                        Clients.All.SendAsync("GetOnlineResponse", $"[{tokenModelJwt.UserName}({tokenModelJwt.Role})] 上线");
+
+                        //
+                    }
+                }
+            }
+
+            //给当前连接返回消息
+            //await Clients.Client(connid).SendAsync("SignalRLoginResponse", result);
+
             return base.OnConnectedAsync();
         }
 
@@ -74,7 +106,7 @@ namespace OASystem.API.OAMethodLib.Hub.Hubs
 
                 var onlineUser = UserStore.OnlineUser.FindAll(u => u.GroupName == model.GroupName);
 
-                Clients.Group(model.GroupName).SendAsync("GetUsersResponse", onlineUser);
+                Clients.Group(model.GroupName).SendAsync("GetDisconnectResponse", onlineUser);
             }
             return base.OnDisconnectedAsync(exception);
         }
@@ -95,6 +127,20 @@ namespace OASystem.API.OAMethodLib.Hub.Hubs
         }
 
 
-        
+        /// <summary>
+        /// 发送消息给指定用户(系统)
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        public async Task SendSystemToUser(string id, string message) => await Clients.Client(id).SendAsync("ReceiveMessage", message);
+
+        /// <summary>
+        /// 发送消息给所有用户(系统)
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        public async Task SendSystemToAllUser(string message) => await Clients.All.SendAsync("ReceiveMessage", message);
     }
 }

+ 0 - 1
OASystem/OASystem.Api/OAMethodLib/SignalR/Hubs/UserStore.cs

@@ -6,7 +6,6 @@
 
     }
 
-
     public class UserModel
     {
         public int UserId { get; set; }

+ 1 - 2
OASystem/OASystem.Api/Program.cs

@@ -54,8 +54,7 @@ builder.Services.AddControllers()
         //options.JsonSerializerOptions.Converters.Add(new JsonConverterDecimal(0.0000M));
     });
 
-//// Ìí¼ÓÊÚȨ·þÎñ
-//builder.Services.AddMyJWTBearerAuth();
+builder.Services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
 
 #region Cors
 builder.Services.AddCors(policy =>