using System; using System.Runtime.Serialization; using System.Threading; using MECF.Framework.Common.Account.Extends; namespace Aitex.Core.Account; /// /// 登录凭据。 /// /// /// RT使用该对象维护用户登录信息,包括:登录激活状态维持、WCF远程调用权限验证。 /// [Serializable] [DataContract] public class Credential { #region Consturctors /// /// 创建登录凭据的实例。 /// /// /// 该构造函数用于WCF通讯,RT中创建该对象是请使用有参数的构造函数。 /// public Credential() { Token = Guid.Empty; State = CredentialState.Requesting; LoginTime = DateTime.MinValue; LastAliveTime = DateTime.Now; LoginRequestCancellationTokenSource = new CancellationTokenSource(); } /// /// 创建登录凭据的实例。 /// /// 登录令牌。 /// 登录账户信息。 public Credential(Guid token, AccountEx accountInfo) : this() { Token = token; AccountInfo = accountInfo; } #endregion #region Properties /// /// 登录请求取消。 /// internal CancellationTokenSource LoginRequestCancellationTokenSource { get; } /// /// 设置或返回当前凭据包含的令牌。 /// [DataMember] public Guid Token { get; set; } /// /// 设置或返回当前凭据状态 /// [DataMember] public CredentialState State { get; set; } /// /// 设置或返回最后一次激活时间。 /// [DataMember] public DateTime LastAliveTime { get; set; } /// /// 设置或返回账户角色。 /// [DataMember] public string RoleID { get; set; } /// /// 设置或返回登录的账户信息。 /// [DataMember] public AccountEx AccountInfo { get; set; } /// /// 返回当前凭据对应客户端信息。 /// [DataMember] public LoginClientInfo ClientInfo { get; set; } /// /// 设置或返回客户端IP地址。 /// [DataMember] public string LoginIP { get; set; } /// /// 设置或返回客户端Port。 /// [DataMember] public int LoginPort { get; set; } /// /// 设置或返回登录时间。 /// [DataMember] public DateTime LoginTime { get; set; } /// /// 设置或返回登录结果描述。 /// [DataMember] public string Description { get; set; } /// /// 返回空凭据。 /// public static Credential Empty => new Credential(); public static Credential ReadOnlyOne => new Credential(Guid.Empty, new AccountEx("", "Read-Only", "", "", "", "", null)); #endregion #region Methods /// /// 检查指定的凭据是否为空凭据。 /// /// /// public static bool IsEmpty(Credential cred) { return cred == null || cred.Token == Guid.Empty; } /// public override string ToString() { return $"{AccountInfo.LoginName}@{LoginIP}:{LoginPort}"; } #endregion }