public static void AddMinerClientSession(WsUserName wsUserName, UserData userData, IPEndPoint remoteEndPoint, IWsSessionAdapter session) { IMinerClientSession minerSession = MinerClientSession.Create(userData, wsUserName, remoteEndPoint, session.SessionId, WsServer.MinerClientWsSessions); MinerClientSessionSet.Add(minerSession); // 通知WebApiServer节点该矿机Ws连线了 MinerClientMqSender.SendMinerClientWsOpened(minerSession.LoginName, minerSession.ClientId); bool isMinerSignChanged; if (!MinerSignSet.TryGetByClientId(wsUserName.ClientId, out MinerSign minerSign)) { // 此时该矿机是第一次在服务端出现 minerSign = new MinerSign { Id = LiteDB.ObjectId.NewObjectId().ToString(), ClientId = wsUserName.ClientId, LoginName = userData.LoginName, OuterUserId = wsUserName.UserId, AESPassword = string.Empty, AESPasswordOn = Timestamp.UnixBaseTime }; isMinerSignChanged = true; } else { isMinerSignChanged = minerSign.OuterUserId != wsUserName.UserId || minerSign.LoginName != userData.LoginName; if (isMinerSignChanged) { minerSign.OuterUserId = wsUserName.UserId; minerSign.LoginName = userData.LoginName; } } // 通常执行不到,因为用户注册的时候已经生成了RSA公私钥对了 if (string.IsNullOrEmpty(userData.PublicKey) || string.IsNullOrEmpty(userData.PrivateKey)) { var key = Cryptography.RSAUtil.GetRASKey(); userData.PublicKey = key.PublicKey; userData.PrivateKey = key.PrivateKey; UserMqSender.SendUpdateUserRSAKey(userData.LoginName, key); } DateTime now = DateTime.Now; if (string.IsNullOrEmpty(minerSign.AESPassword) || minerSign.AESPasswordOn.AddDays(1) < now) { isMinerSignChanged = true; minerSign.AESPassword = Cryptography.AESUtil.GetRandomPassword(); minerSign.AESPasswordOn = now; } session.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.UpdateAESPassword) { Data = new AESPassword { PublicKey = userData.PublicKey, Password = Cryptography.RSAUtil.EncryptString(minerSign.AESPassword, userData.PrivateKey) } }.SignToJson(minerSign.AESPassword)); if (isMinerSignChanged) { MinerClientMqSender.SendChangeMinerSign(minerSign); } }
protected override void OnOpen() { base.OnOpen(); if (!this.TryGetUser(out WsUserName wsUserName, out UserData userData)) { this.CloseAsync(); return; } IMinerClientSession minerSession = MinerClientSession.Create(userData, wsUserName, this.ID); WsRoot.MinerClientSessionSet.Add(minerSession); WsRoot.MinerClientMqSender.SendMinerClientWsOpened(minerSession.LoginName, minerSession.ClientId); if (!WsRoot.MinerSignSet.TryGetByClientId(wsUserName.ClientId, out MinerSign minerSign)) { minerSign = new MinerSign { Id = LiteDB.ObjectId.NewObjectId().ToString(), ClientId = wsUserName.ClientId, LoginName = userData.LoginName, OuterUserId = wsUserName.UserId, AESPassword = string.Empty, AESPasswordOn = Timestamp.UnixBaseTime }; } bool isMinerSignChanged = minerSign.OuterUserId != wsUserName.UserId || minerSign.LoginName != userData.LoginName; if (isMinerSignChanged) { minerSign.OuterUserId = wsUserName.UserId; minerSign.LoginName = userData.LoginName; } if (string.IsNullOrEmpty(userData.PublicKey) || string.IsNullOrEmpty(userData.PrivateKey)) { var key = Cryptography.RSAUtil.GetRASKey(); userData.PublicKey = key.PublicKey; userData.PrivateKey = key.PrivateKey; WsRoot.UserMqSender.SendUpdateUserRSAKey(userData.LoginName, key); } DateTime now = DateTime.Now; if (string.IsNullOrEmpty(minerSign.AESPassword) || minerSign.AESPasswordOn.AddDays(1) < now) { isMinerSignChanged = true; minerSign.AESPassword = Cryptography.AESUtil.GetRandomPassword(); minerSign.AESPasswordOn = now; } base.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.UpdateAESPassword) { Data = new AESPassword { PublicKey = userData.PublicKey, Password = Cryptography.RSAUtil.EncryptString(minerSign.AESPassword, userData.PrivateKey) } }.SignToJson(minerSign.AESPassword), completed: null); if (isMinerSignChanged) { WsRoot.MinerClientMqSender.SendChangeMinerSign(minerSign); } }