2023-04-13 11:51:03 +08:00
|
|
|
|
using System;
|
2023-09-12 18:11:47 +08:00
|
|
|
|
using System.Diagnostics;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
2023-08-29 17:45:38 +08:00
|
|
|
|
using System.ServiceModel;
|
|
|
|
|
using System.ServiceModel.Channels;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
using System.Threading;
|
2023-09-07 23:30:33 +08:00
|
|
|
|
using System.Threading.Tasks;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
using Aitex.Common.Util;
|
|
|
|
|
using Aitex.Core.Account;
|
|
|
|
|
using Aitex.Core.RT.Event;
|
|
|
|
|
using Aitex.Core.RT.Log;
|
2023-10-17 16:53:32 +08:00
|
|
|
|
using Aitex.Core.RT.SCCore;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
using Aitex.Core.Util;
|
|
|
|
|
using Aitex.Core.WCF;
|
|
|
|
|
using MECF.Framework.Common.Account.Extends;
|
2023-08-29 17:45:38 +08:00
|
|
|
|
using MECF.Framework.Common.Equipment;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
namespace MECF.Framework.Common.Account
|
|
|
|
|
{
|
2023-09-14 09:45:11 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 账号管理器。
|
|
|
|
|
/// </summary>
|
2023-04-13 11:51:03 +08:00
|
|
|
|
public class AccountExManager : Singleton<AccountExManager>
|
|
|
|
|
{
|
2023-08-28 11:30:57 +08:00
|
|
|
|
#region Variables
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-09-05 11:33:11 +08:00
|
|
|
|
private readonly string _scAccountTemplateFile = PathManager.GetCfgDir() + "Account//Account.xml";
|
|
|
|
|
private readonly string _scAccountLocalFile = PathManager.GetCfgDir() + "Account//_AccountEx.xml";
|
2023-09-06 15:25:32 +08:00
|
|
|
|
|
2023-09-06 14:45:06 +08:00
|
|
|
|
// 旧的_Account.xml文件路径,为兼容已有的账户配置。
|
|
|
|
|
private readonly string _oldAccountXmlFile = PathManager.GetCfgDir() + "Account//_Account.xml";
|
|
|
|
|
|
2023-09-13 17:31:22 +08:00
|
|
|
|
private readonly SemaphoreSlim _syncRoot = new SemaphoreSlim(1, 1);
|
2023-09-06 14:45:06 +08:00
|
|
|
|
|
2023-10-17 16:53:32 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 是否启用单会话登录模式。
|
|
|
|
|
/// </summary>
|
|
|
|
|
private bool _enableSingleSessionMode;
|
|
|
|
|
|
2023-09-06 14:45:06 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
2023-09-12 18:11:47 +08:00
|
|
|
|
#region Constructors
|
2023-09-06 14:45:06 +08:00
|
|
|
|
|
|
|
|
|
public AccountExManager()
|
|
|
|
|
{
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-06 14:45:06 +08:00
|
|
|
|
}
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-08-28 11:30:57 +08:00
|
|
|
|
#endregion
|
2023-09-06 15:25:32 +08:00
|
|
|
|
|
2023-08-28 11:30:57 +08:00
|
|
|
|
#region Properties
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-08-28 11:30:57 +08:00
|
|
|
|
/// <summary>
|
2023-09-05 09:27:56 +08:00
|
|
|
|
/// 返回角色加载器。
|
2023-08-28 11:30:57 +08:00
|
|
|
|
/// </summary>
|
2023-09-20 17:25:51 +08:00
|
|
|
|
public RoleAccountLoader RoleAccountLoader { get; private set; }
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-08-28 11:30:57 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Methods
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 初始化当前对象。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="enableService"></param>
|
|
|
|
|
/// <exception cref="ApplicationException"></exception>
|
2023-04-13 11:51:03 +08:00
|
|
|
|
public void Initialize(bool enableService)
|
2023-10-17 16:53:32 +08:00
|
|
|
|
{
|
|
|
|
|
_enableSingleSessionMode = SC.SafeGetValue("System.SingleSessionLoginMode", false);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!File.Exists(_scAccountLocalFile))
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-06 14:45:06 +08:00
|
|
|
|
if (File.Exists(_oldAccountXmlFile))
|
|
|
|
|
{
|
|
|
|
|
// 如果已存在_Account.xml,则从_Account.xml创建_AccountEx.xml文件。
|
|
|
|
|
File.Copy(_oldAccountXmlFile, _scAccountLocalFile);
|
|
|
|
|
Thread.Sleep(10);
|
|
|
|
|
}
|
|
|
|
|
else if (File.Exists(_scAccountTemplateFile))
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-06 14:45:06 +08:00
|
|
|
|
File.Copy(_scAccountTemplateFile, _scAccountLocalFile);
|
|
|
|
|
Thread.Sleep(10);
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
2023-09-19 13:18:08 +08:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// 模板文件不存在
|
|
|
|
|
throw new ApplicationException("Can not initialize account configuration file, " +
|
|
|
|
|
_scAccountTemplateFile);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-09-06 14:45:06 +08:00
|
|
|
|
|
2023-09-12 18:11:47 +08:00
|
|
|
|
// 默认不支持多用户登录。
|
2023-10-17 16:53:32 +08:00
|
|
|
|
CredentialManager.Instance.Initialize(!_enableSingleSessionMode);
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-20 17:25:51 +08:00
|
|
|
|
RoleAccountLoader = new RoleAccountLoader(_scAccountLocalFile);
|
|
|
|
|
RoleAccountLoader.Load();
|
2023-09-05 10:20:23 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
if (enableService)
|
|
|
|
|
{
|
|
|
|
|
Singleton<WcfServiceManager>.Instance.Initialize(new Type[1] { typeof(AccountService) });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-13 17:31:22 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取WCF客户端IP信息。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
2023-09-14 09:45:11 +08:00
|
|
|
|
private static RemoteEndpointMessageProperty GetCurrentWCFClientEndPoint()
|
2023-08-29 17:45:38 +08:00
|
|
|
|
{
|
|
|
|
|
var context = OperationContext.Current;
|
|
|
|
|
var prop = context.IncomingMessageProperties;
|
|
|
|
|
var endpoint =
|
|
|
|
|
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
|
|
|
|
|
return endpoint;
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-13 17:31:22 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 等待已登录的用户确认是否允许新的登录请求。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="userLoggedIn">已登录用户的凭据。</param>
|
|
|
|
|
/// <param name="userRequesting">新用户的登录凭据。</param>
|
|
|
|
|
/// <returns></returns>
|
2023-09-14 09:45:11 +08:00
|
|
|
|
private static async Task<LoginRequestResults> RequestAndWaitLoginConfirmation(Credential userLoggedIn,
|
2023-09-13 17:31:22 +08:00
|
|
|
|
Credential userRequesting)
|
2023-09-07 23:30:33 +08:00
|
|
|
|
{
|
2023-09-13 17:31:22 +08:00
|
|
|
|
// 等待已登录用户响应,返回结果;
|
|
|
|
|
// 1. Rejected,拒绝新的登录请求
|
|
|
|
|
// 2. Logged Out,主动注销,允许新的登录请求
|
|
|
|
|
// 3. Timeout,超时没有响应,保持原用户的登录凭据
|
2023-09-07 23:30:33 +08:00
|
|
|
|
return await Task.Run(async () =>
|
|
|
|
|
{
|
2023-09-13 17:31:22 +08:00
|
|
|
|
// 通知已登录的用户,其它客户端使用该用户名登录,是否允许登录
|
|
|
|
|
var ct = userRequesting.LoginRequestCancellationTokenSource.Token;
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
|
|
|
|
// 等待已登录的凭据被移除(客户端注销)
|
|
|
|
|
var sw = new Stopwatch();
|
|
|
|
|
sw.Start();
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-12 18:11:47 +08:00
|
|
|
|
while (true)
|
|
|
|
|
{
|
2023-09-18 14:17:34 +08:00
|
|
|
|
switch (userRequesting.State)
|
|
|
|
|
{
|
|
|
|
|
case CredentialState.Confirmed:
|
|
|
|
|
// 客户端已注销,可以放行新的凭据
|
|
|
|
|
CredentialManager.Instance.Grant(userRequesting);
|
|
|
|
|
EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedIn,
|
|
|
|
|
userLoggedIn.AccountInfo.LoginName);
|
|
|
|
|
return await Task.FromResult(LoginRequestResults.Confirmed);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
2023-09-18 14:17:34 +08:00
|
|
|
|
case CredentialState.Reject or CredentialState.RequestCanceled:
|
|
|
|
|
if(userRequesting.State == CredentialState.Reject)
|
|
|
|
|
// 已登录用户拒绝了登录请求
|
|
|
|
|
EV.PostInfoLog(ModuleName.System.ToString(),
|
|
|
|
|
$"User {userRequesting.AccountInfo.LoginName}'s login request from {userRequesting.LoginIP}:{userRequesting.LoginPort} is rejected");
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-18 14:17:34 +08:00
|
|
|
|
return await Task.FromResult(LoginRequestResults.Rejected);
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-18 14:17:34 +08:00
|
|
|
|
case CredentialState.Requesting:
|
|
|
|
|
case CredentialState.Alive:
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(200);
|
|
|
|
|
if (ct.IsCancellationRequested)
|
|
|
|
|
break;
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
2023-09-14 23:55:38 +08:00
|
|
|
|
// 等待指定的时间,然后向申请端发送超时
|
2023-09-18 15:51:37 +08:00
|
|
|
|
if (sw.Elapsed.TotalSeconds > CredentialManager.REQ_LOGIN_CRED_LIFT_TIME_SEC)
|
2023-09-12 18:11:47 +08:00
|
|
|
|
break;
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-12 18:11:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-14 23:55:38 +08:00
|
|
|
|
// 等待确认超时
|
2023-09-12 18:11:47 +08:00
|
|
|
|
return LoginRequestResults.Timeout;
|
2023-09-13 17:31:22 +08:00
|
|
|
|
});
|
2023-09-07 23:30:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-15 17:44:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 登录。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="userName">用户名</param>
|
|
|
|
|
/// <param name="password">密码</param>
|
|
|
|
|
/// <param name="roleID">角色ID</param>
|
|
|
|
|
/// <param name="clientInfo">发起登录请求的客户端信息</param>
|
|
|
|
|
/// <returns><see cref="LoginRequestResults"/></returns>
|
|
|
|
|
/// <exception cref="TimeoutException"></exception>
|
|
|
|
|
internal async Task<LoginResult> Login(string userName, string password, string roleID,
|
2023-09-12 18:11:47 +08:00
|
|
|
|
LoginClientInfo clientInfo)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-13 17:31:22 +08:00
|
|
|
|
var endPoint = GetCurrentWCFClientEndPoint();
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
|
|
|
|
try
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-20 17:25:51 +08:00
|
|
|
|
var accountList = RoleAccountLoader.GetAccounts();
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
2023-09-13 17:31:22 +08:00
|
|
|
|
var matchedAccount = accountList.FirstOrDefault(x => x.LoginName == userName);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
if (matchedAccount == null)
|
|
|
|
|
// 用户不存在
|
2023-09-13 17:31:22 +08:00
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.NoMatchUser));
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
|
|
|
|
if (matchedAccount.Password != password)
|
|
|
|
|
// 密码错误
|
2023-09-13 17:31:22 +08:00
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.WrongPwd));
|
2023-09-06 14:45:06 +08:00
|
|
|
|
|
2023-09-12 18:11:47 +08:00
|
|
|
|
// 查找当前用户的登录角色是否存在
|
2023-09-13 17:31:22 +08:00
|
|
|
|
var matchedRole = matchedAccount.RoleIDs.FirstOrDefault(x => x == roleID);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
if (matchedRole == null)
|
|
|
|
|
// 找不到角色
|
2023-09-13 17:31:22 +08:00
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.NoMatchRole));
|
|
|
|
|
|
2023-09-12 18:11:47 +08:00
|
|
|
|
// 创建新凭据
|
2023-09-14 23:55:38 +08:00
|
|
|
|
var requestingCred = new Credential(CredentialManager.GenerateToken(), matchedAccount)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-06 14:45:06 +08:00
|
|
|
|
LoginIP = endPoint.Address,
|
2023-09-14 23:55:38 +08:00
|
|
|
|
LoginPort = endPoint.Port,
|
|
|
|
|
ClientInfo = clientInfo,
|
|
|
|
|
RoleID = roleID
|
2023-09-06 14:45:06 +08:00
|
|
|
|
};
|
|
|
|
|
|
2023-10-17 16:53:32 +08:00
|
|
|
|
// 如果禁用了单会话登录模式,则直接放行凭据。
|
|
|
|
|
if (!_enableSingleSessionMode)
|
|
|
|
|
{
|
|
|
|
|
CredentialManager.Instance.ForceGrant(requestingCred);
|
|
|
|
|
EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedIn, $"{userName}@{requestingCred.LoginIP}:{requestingCred.LoginPort}");
|
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.Confirmed, requestingCred));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果还没有任何用户登录到RT,则直接放行
|
2023-09-18 15:51:37 +08:00
|
|
|
|
if (CredentialManager.Instance.LoggedInCount == 0 && CredentialManager.Instance.LoginRequestingCount == 0)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-18 15:51:37 +08:00
|
|
|
|
// 添加凭据到登录请求列表,Grant时需要请求列表中存在此凭据。
|
|
|
|
|
CredentialManager.Instance.AddRequestingList(requestingCred);
|
|
|
|
|
|
|
|
|
|
// 没有用户登录,直接发放凭据
|
|
|
|
|
CredentialManager.Instance.Grant(requestingCred);
|
2023-09-15 17:44:30 +08:00
|
|
|
|
EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedIn, $"{userName}@{requestingCred.LoginIP}:{requestingCred.LoginPort}");
|
2023-09-14 23:55:38 +08:00
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.Confirmed, requestingCred));
|
2023-09-12 18:11:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (CredentialManager.Instance.IsSupportMultiUserLogin)
|
|
|
|
|
{
|
2023-09-18 15:51:37 +08:00
|
|
|
|
// 支持多用户同时登录
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-18 15:51:37 +08:00
|
|
|
|
// 如果当前用户名正在请求登录,则拒绝发起新的请求。
|
|
|
|
|
if (CredentialManager.Instance.GetRequestingCredential(userName) != null)
|
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.RequstingLogin));
|
|
|
|
|
|
|
|
|
|
// 添加凭据到登录请求列表,Grant时需要请求列表中存在此凭据。
|
|
|
|
|
CredentialManager.Instance.AddRequestingList(requestingCred);
|
|
|
|
|
|
|
|
|
|
// 查找当前请求的用户是否已经登录
|
|
|
|
|
var loggedCred = CredentialManager.Instance.GetCredential(userName);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
if (loggedCred == null)
|
2023-09-04 17:22:01 +08:00
|
|
|
|
{
|
2023-09-12 18:11:47 +08:00
|
|
|
|
// 用户未登录,直接放行凭据
|
2023-09-14 23:55:38 +08:00
|
|
|
|
CredentialManager.Instance.Grant(requestingCred);
|
2023-09-15 17:44:30 +08:00
|
|
|
|
EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedIn, $"{userName}@{requestingCred.LoginIP}:{requestingCred.LoginPort}");
|
2023-09-14 23:55:38 +08:00
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.Confirmed, requestingCred));
|
2023-09-06 14:45:06 +08:00
|
|
|
|
}
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
2023-09-18 15:51:37 +08:00
|
|
|
|
// 否则等待已登录的Session确认
|
2023-09-14 23:55:38 +08:00
|
|
|
|
var ret = await RequestAndWaitLoginConfirmation(loggedCred, requestingCred);
|
|
|
|
|
return ret == LoginRequestResults.Confirmed ? new LoginResult(ret, requestingCred) : new LoginResult(ret);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
|
2023-09-06 14:45:06 +08:00
|
|
|
|
}
|
2023-09-12 18:11:47 +08:00
|
|
|
|
else
|
2023-09-06 14:45:06 +08:00
|
|
|
|
{
|
2023-09-18 15:51:37 +08:00
|
|
|
|
// 仅支持单一用户登录
|
2023-09-13 17:31:22 +08:00
|
|
|
|
if (CredentialManager.Instance.LoggedInCount > 1)
|
2023-09-12 18:11:47 +08:00
|
|
|
|
{
|
|
|
|
|
EV.PostWarningLog(ModuleName.System.ToString(),
|
|
|
|
|
$"{nameof(CredentialManager)} does not support multiple users login but more than one credentials found.");
|
|
|
|
|
}
|
2023-09-04 17:22:01 +08:00
|
|
|
|
|
2023-09-18 15:51:37 +08:00
|
|
|
|
// 如果有正在请求登录,则拒绝发起新的请求。
|
|
|
|
|
if (CredentialManager.Instance.LoginRequestingCount > 0)
|
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.RequstingLogin));
|
|
|
|
|
|
|
|
|
|
// 添加凭据到登录请求列表,Grant时需要请求列表中存在此凭据。
|
|
|
|
|
CredentialManager.Instance.AddRequestingList(requestingCred);
|
|
|
|
|
|
|
|
|
|
// 已登录的用户凭据
|
|
|
|
|
var loggedCred = CredentialManager.Instance.GetCredential();
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-14 23:55:38 +08:00
|
|
|
|
var ret = await RequestAndWaitLoginConfirmation(loggedCred, requestingCred);
|
|
|
|
|
return ret == LoginRequestResults.Confirmed ? new LoginResult(ret, requestingCred) : new LoginResult(ret);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LOG.Error(ex.Message, ex);
|
2023-09-13 17:31:22 +08:00
|
|
|
|
return await Task.FromResult(new LoginResult(LoginRequestResults.Error));
|
2023-09-12 18:11:47 +08:00
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-06 14:45:06 +08:00
|
|
|
|
}
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-15 17:44:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 登录请求发起端取消登录请求。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="userName"></param>
|
|
|
|
|
internal void CancelLoginRequest(string userName)
|
2023-09-12 18:11:47 +08:00
|
|
|
|
{
|
2023-09-18 15:51:37 +08:00
|
|
|
|
CredentialManager.Instance.Cancel(userName);
|
2023-09-18 14:17:34 +08:00
|
|
|
|
}
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-15 17:44:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 确认登录请求。
|
|
|
|
|
/// </summary>
|
2023-09-18 10:13:40 +08:00
|
|
|
|
/// <param name="userName"></param>
|
|
|
|
|
internal void ConfirmedLoginRequest(string userName)
|
2023-09-13 17:31:22 +08:00
|
|
|
|
{
|
2023-09-18 15:51:37 +08:00
|
|
|
|
CredentialManager.Instance.Accept(userName);
|
2023-09-13 17:31:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-15 17:44:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 拒绝登录请求。
|
|
|
|
|
/// </summary>
|
2023-09-18 10:13:40 +08:00
|
|
|
|
/// <param name="userName"></param>
|
|
|
|
|
internal void RejectLoginRequest(string userName)
|
2023-09-13 17:31:22 +08:00
|
|
|
|
{
|
2023-09-18 15:51:37 +08:00
|
|
|
|
CredentialManager.Instance.Reject(userName);
|
2023-09-12 18:11:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-18 10:13:40 +08:00
|
|
|
|
internal void Logout(Guid myToken)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-09-18 10:13:40 +08:00
|
|
|
|
var loginCred = CredentialManager.Instance.GetCredential(myToken);
|
2023-09-14 14:17:16 +08:00
|
|
|
|
if (loginCred != null)
|
2023-09-15 17:44:30 +08:00
|
|
|
|
{
|
|
|
|
|
EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedOff,
|
|
|
|
|
$"{loginCred.AccountInfo.LoginName}@{loginCred.LoginIP}:{loginCred.LoginPort}");
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-18 10:13:40 +08:00
|
|
|
|
CredentialManager.Instance.Remove(myToken);
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
2023-09-13 17:31:22 +08:00
|
|
|
|
|
2023-09-22 11:04:49 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 校验指定账户密码是否正确。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="accountId">账号ID</param>
|
|
|
|
|
/// <param name="passwordMD5">MD5加密后的密码</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
internal bool CheckPassword(string accountId, string passwordMD5)
|
|
|
|
|
{
|
|
|
|
|
var account = RoleAccountLoader.GetAccounts().FirstOrDefault(x => x.UserId == accountId);
|
|
|
|
|
if (account == null)
|
|
|
|
|
{
|
|
|
|
|
LOG.Error($"CheckPassword Unable to find the account with ID {accountId}");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return account.Password == passwordMD5;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-28 11:30:57 +08:00
|
|
|
|
#endregion
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|