using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.ServiceModel; using System.ServiceModel.Channels; using System.Threading; using Aitex.Common.Util; using Aitex.Core.Account; using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using Aitex.Core.Util; using Aitex.Core.WCF; using MECF.Framework.Common.Account.Extends; using MECF.Framework.Common.Equipment; namespace MECF.Framework.Common.Account { public class AccountExManager : Singleton { #region Variables private readonly Dictionary _dicLoginNameToLoginResult = new (); private readonly Dictionary _dicSessionIdToLoginResult = new (); private readonly string _scAccountFile = PathManager.GetCfgDir() + "Account//Account.xml"; private readonly string _scAccountLocalFile = PathManager.GetCfgDir() + "Account//_Account.xml"; #endregion #region Properties /// /// /// public RoleLoader RoleLoader { get; private set; } #endregion #region Methods /// /// 初始化当前对象。 /// /// /// public void Initialize(bool enableService) { if (!File.Exists(_scAccountLocalFile)) { if (!File.Exists(_scAccountFile)) { throw new ApplicationException("Can not initialize account configuration file, " + _scAccountFile); } File.Copy(_scAccountFile, _scAccountLocalFile); Thread.Sleep(10); } RoleLoader = new RoleLoader(_scAccountLocalFile); RoleLoader.Load(); if (enableService) { Singleton.Instance.Initialize(new Type[1] { typeof(AccountService) }); } } private RemoteEndpointMessageProperty GetCurrentEndPoint() { var context = OperationContext.Current; var prop = context.IncomingMessageProperties; var endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; return endpoint; } public LoginResult AuthLogin(string loginName, string password, string role, LoginClientInfo clientInfo) { var endPoint = GetCurrentEndPoint(); var loginResult = new LoginResult { ActSucc = true, SessionId = Guid.NewGuid().ToString(), LoginIP = endPoint.Address, LoginPort = endPoint.Port, LoginTime = DateTime.Now }; try { var accountList = RoleLoader.AccountList; var accountEx = accountList.FirstOrDefault(x => x.LoginName == loginName); if (accountEx == null) { loginResult.ActSucc = false; loginResult.Description = AuthorizeResult.NoMatchUser.ToString(); } else { foreach (var account in accountList) { if (account.LoginName == loginName && account.Password == password) { foreach (var roleId in account.RoleIDs) { if (roleId == role) { loginResult.ActSucc = true; loginResult.AccountEx = account; loginResult.Description = AuthorizeResult.None.ToString(); if (_dicLoginNameToLoginResult.TryGetValue(loginName, out var loggedInfo)) { // 如果当前用户从其它电脑登录,则踢掉之 _dicSessionIdToLoginResult.Remove(loggedInfo.SessionId); _dicLoginNameToLoginResult.Remove(loginName); EV.PostLoginBySameUser(new Credential(loggedInfo.SessionId, loginName)); } _dicLoginNameToLoginResult[loginName] = loginResult; _dicSessionIdToLoginResult[loginResult.SessionId] = loginResult; EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedIn, loginResult); return loginResult; } // 登录失败,当前账户不在指定的角色中。 loginResult.ActSucc = false; loginResult.Description = AuthorizeResult.NoMatchRole.ToString(); } return loginResult; } // 登录失败,密码错误 loginResult.ActSucc = false; loginResult.Description = AuthorizeResult.WrongPwd.ToString(); } } } catch (Exception ex) { LOG.Error(ex.Message, ex); } return loginResult; } internal void Logout(string loginName, string sessionId) { foreach (var key in _dicLoginNameToLoginResult.Keys) { if (loginName == key && _dicLoginNameToLoginResult[key].SessionId == sessionId) { EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedOff, _dicLoginNameToLoginResult[loginName]); _dicLoginNameToLoginResult.Remove(loginName); _dicSessionIdToLoginResult.Remove(key); break; } } } #endregion } }