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 _scAccountTemplateFile = PathManager.GetCfgDir() + "Account//Account.xml"; private readonly string _scAccountLocalFile = PathManager.GetCfgDir() + "Account//_AccountEx.xml"; #endregion #region Properties /// /// 返回角色加载器。 /// public RoleLoader RoleLoader { get; private set; } /// /// 返回菜单加载器。 /// public MenuLoader MenuLoader { get; private set; } #endregion #region Methods /// /// 初始化当前对象。 /// /// /// public void Initialize(bool enableService) { if (!File.Exists(_scAccountLocalFile)) { if (!File.Exists(_scAccountTemplateFile)) { throw new ApplicationException("Can not initialize account configuration file, " + _scAccountTemplateFile); } File.Copy(_scAccountTemplateFile, _scAccountLocalFile); Thread.Sleep(10); } RoleLoader = new RoleLoader(_scAccountLocalFile); RoleLoader.Load(); MenuLoader = new MenuLoader(PathManager.GetCfgDir() + "menu.xml"); MenuLoader.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 { var matchedAccount = accountList.FirstOrDefault(x => x.LoginName == loginName); if (matchedAccount == null) { // 登录失败,当前账户不在指定的角色中。 loginResult.ActSucc = false; loginResult.Description = AuthorizeResult.NoMatchUser.ToString(); return loginResult; } if (matchedAccount.Password != password) { // 登录失败,密码错误 loginResult.ActSucc = false; loginResult.Description = AuthorizeResult.WrongPwd.ToString(); return loginResult; } // 查找当前用户的登录角色是否存在 foreach (var roleId in matchedAccount.RoleIDs) { if (roleId == role) { loginResult.ActSucc = true; loginResult.AccountEx = matchedAccount; 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; } } 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 } }