Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/MECF/Framework/Common/Account/AccountExManager.cs

148 lines
3.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Threading;
using Aitex.Common.Util;
using Aitex.Core.Account;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using Aitex.Core.WCF;
using MECF.Framework.Common.Account.Extends;
namespace MECF.Framework.Common.Account
{
public class AccountExManager : Singleton<AccountExManager>
{
#region Variables
private readonly Dictionary<string, LoginResult> _dicLoginNameToLoginResult = new ();
private readonly Dictionary<string, LoginResult> _dicSessionIdToLoginResult = new ();
private readonly string _scAccountFile = PathManager.GetCfgDir() + "Account//Account.xml";
private readonly string _scAccountLocalFile = PathManager.GetCfgDir() + "Account//_Account.xml";
#endregion
#region Properties
/// <summary>
///
/// </summary>
public RoleLoader RoleLoader { get; private set; }
#endregion
#region Methods
/// <summary>
/// 初始化当前对象。
/// </summary>
/// <param name="enableService"></param>
/// <exception cref="ApplicationException"></exception>
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<WcfServiceManager>.Instance.Initialize(new Type[1] { typeof(AccountService) });
}
}
public LoginResult AuthLogin(string loginName, string password, string role, LoginClientInfo clientInfo)
{
var loginResult = new LoginResult
{
ActSucc = true,
SessionId = Guid.NewGuid().ToString(),
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.AccountInfo = account;
loginResult.Description = AuthorizeResult.None.ToString();
foreach (var kvp in _dicLoginNameToLoginResult)
{
var loggedIn = kvp.Value;
if (!SC.ContainsItem("System.AllowMultiClientLogin") ||
!SC.GetValue<bool>("System.AllowMultiClientLogin") ||
loggedIn.AccountInfo.LoginName == loginName)
{
EV.PostKickoutMessage(loggedIn.SessionId);
}
}
account.SessionId = loginResult.SessionId;
_dicLoginNameToAccountInfo[loginName] = account;
_dicSessionIdToAccountInfo[account.SessionId] = account;
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 accountId, string loginId)
{
foreach (string key in _dicLoginNameToAccountInfo.Keys)
{
if (accountId == key && _dicLoginNameToAccountInfo[key].SessionId == loginId)
{
_dicSessionIdToAccountInfo.Remove(accou)
_dicLoginNameToAccountInfo.Remove(key);
break;
}
}
}
#endregion
}
}