/// <summary> /// 检查用户在线数量。 /// </summary> /// <param name="account">账号。</param> /// <returns>验证结果。</returns> private IPermissionVerifyResult CheckOnlineCount(string account) { var access = BLLAccess.GetInstance(); if (string.IsNullOrEmpty(account)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户名为空, PermissionVerifyMessage = "用户名为空!" }); } //查询在线同时在线的客户端信息。 DateTime onlineDateTime = PermissionArgs.GetInstance().OnlineDateTime; var onlineLog = access.Select_User_Data_Login_Log(account: account, dateTimeUpdate_Start: onlineDateTime, offline: 0); var onlineLogList = onlineLog.Tables[0].AsEnumerable(); int permitOnlineCount = PermissionArgs.GetInstance().OnlineCount; //判断账号在线个数是否在允许范围内。 int len = onlineLogList.Count() - permitOnlineCount; if (len == 0) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户已达到限制登录数量, PermissionVerifyMessage = "用户已达到限制登录数量,不允许继续连接登录!" }); } else if (len > 0) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户登陆过多, PermissionVerifyMessage = "用户登陆过多!" }); } else { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.允许用户继续登录, PermissionVerifyMessage = "允许用户继续登录。" }); } }
/// <summary> /// 检查用户客户端凭证。 /// </summary> /// <param name="account">账号。</param> /// <param name="clientPassword">客户端密码。</param> /// <param name="clientFlag">客户端标记。</param> /// <returns>登陆状态。</returns> private IPermissionVerifyResult CheckUserClientCertificate(string account, string clientPassword, string clientFlag) { if (string.IsNullOrEmpty(account)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户名为空, PermissionVerifyMessage = "用户名为空!" }); } if (string.IsNullOrEmpty(clientPassword)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端密码为空, PermissionVerifyMessage = "客户端密码为空!" }); } if (string.IsNullOrEmpty(clientFlag)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端标记为空, PermissionVerifyMessage = "客户端标记为空!" }); } //获取失效日期,在失效日期之外的日志不参与验证。 DateTime disabledTimeSpan = PermissionArgs.GetInstance().ExpiresDateTime; var access = BLLAccess.GetInstance(); var log = access.Select_User_Data_Login_Log(account: account, dateTimeUpdate_Start: disabledTimeSpan); if (log == null || log.Tables.Count == 0 || log.Tables[0].Rows.Count == 0) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户日志失效, PermissionVerifyMessage = "在有效期内,没有用户日志记录!" }); } //验证客户端标记、客户端密码、用户账号。 var checkLogList = (from i in log.Tables[0].AsEnumerable() where account.Equals(i["Account"].ToString()) && clientPassword.ToLower().Equals(i["ClientPassword"].ToString().ToLower()) && clientFlag.ToLower().Equals(i["ClientFlag"].ToString().ToLower()) select i).ToList(); if (checkLogList.Count() == 0) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端密码无效, PermissionVerifyMessage = "客户端密码无效!" }); } //验证日志是否在线。如果超过在线限定日期,则视为自动下线。 DateTime onlineDateTime = PermissionArgs.GetInstance().OnlineDateTime; DateTime checkOnlineDateTime = checkLogList[0]["DateTimeUpdate"].ToString().ToDateTime(); if (onlineDateTime > checkOnlineDateTime) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端已自动下线, PermissionVerifyMessage = "客户端已自动下线!" }); } //验证日志的Offline标记是否为真,如果为真,表示此连接被强制下线。 if (checkLogList[0]["Offline"].ToString().ToBool()) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端被强制下线, PermissionVerifyMessage = "客户端被强制下线!" }); } return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端密码验证通过, PermissionVerifyMessage = "客户端密码验证通过!" }); }
/// <summary> /// 检查账号访问权限。 /// </summary> /// <param name="url">地址。</param> /// <param name="urlCode">地址编码。</param> /// <param name="account">账号。</param> /// <returns>检查结果。</returns> public IPermissionVerifyResult CheckUrl(string url, string urlCode, string account) { var access = BLLAccess.GetInstance(); if (!PermissionArgs.GetInstance().CheckNoConfigurationUrl) { //部分地址在数据库中无配置。如果不需要检查则认为验证成功。 DataSet urlInfo = access.Select_Url_Data(url: url); if (string.IsNullOrEmpty(urlInfo.GetData().ToString())) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.该地址验证成功, PermissionVerifyMessage = string.Empty }); } } if (string.IsNullOrEmpty(urlCode)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.地址编码为空, PermissionVerifyMessage = "地址编码为空!" }); } if (string.IsNullOrEmpty(account)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户名为空, PermissionVerifyMessage = "用户名为空!" }); } //查询用户的组权限。 IEnumerable <UrlConfigEntity> allowableConfig; IEnumerable <UrlConfigEntity> forbiddenConfig; SeparateGroupUrlConfig(allowableConfig: out allowableConfig, forbiddenConfig: out forbiddenConfig, account: account, url: url, urlCode: urlCode); if (allowableConfig.Count() == 0) { if (forbiddenConfig.Count() > 0) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.拒绝访问该地址, PermissionVerifyMessage = "拒绝用户访问该地址!" }); } return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.该地址验证失败, PermissionVerifyMessage = "用户无权限访问该地址!" }); } else { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.该地址验证成功, PermissionVerifyMessage = "允许用户访问该地址。" }); } }
/// <summary> /// 检查用户凭证。 /// </summary> /// <param name="account">账号。不可空。</param> /// <param name="password">密码。可空。不可与客户端密码、客户端标记同时为空。</param> /// <param name="clientFlag">客户端标记。可空。不可与密码同时为空。</param> /// <param name="clientPassword">客户端密码。可空。不可与密码同时为空。</param> /// <returns>登陆状态。</returns> public IPermissionVerifyResult CheckUserCertificate(string account, string password, string clientFlag, ref string clientPassword) { var access = BLLAccess.GetInstance(); if (string.IsNullOrEmpty(account)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户名为空, PermissionVerifyMessage = "用户名为空!" }); } if (string.IsNullOrEmpty(clientFlag)) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.客户端标记为空, PermissionVerifyMessage = "客户端标记为空!" }); } //验证用户账号、密码的合法性。 var ul = UserLogin(account, password); if (ul.PermissionVerifyState == Enum_PermissionVerifyState.密码为空) { //密码为空的情况下验证输入的客户端信息。 //验证账号在线数量。 var co = CheckOnlineCount(account); if (co.PermissionVerifyState == Enum_PermissionVerifyState.用户登陆过多 && !string.IsNullOrEmpty(clientPassword)) { SetOffline(account, clientPassword); } //检查客户端凭据是否合法。 var cucc = CheckUserClientCertificate(account, clientPassword, clientFlag); if (cucc.PermissionVerifyState == Enum_PermissionVerifyState.客户端密码验证通过) { access.Update_Login_Log_DateTimeUpdate(clientPassword); return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户验证通过, PermissionVerifyMessage = "客户端请求合法,用户验证通过,自动登录!" }); } else { return(cucc); } } else if (ul.PermissionVerifyState == Enum_PermissionVerifyState.密码验证通过) { //在密码验证通过之后,要检查用户在线数量。 var co = CheckOnlineCount(account); if (co.PermissionVerifyState == Enum_PermissionVerifyState.允许用户继续登录) { clientPassword = access.Insert_Login_Log(account, clientFlag).GetData("ClientPassword").ToString(); return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户验证通过, PermissionVerifyMessage = "用户验证通过!" }); } if (co.PermissionVerifyState == Enum_PermissionVerifyState.用户已达到限制登录数量) { //如果在线数量达到了限制,验证输入的客户端信息。 var cucc = CheckUserClientCertificate(account, clientPassword, clientFlag); if (cucc.PermissionVerifyState == Enum_PermissionVerifyState.客户端密码验证通过) { return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户验证通过, PermissionVerifyMessage = "客户端密码验证通过,用户自动登录!" }); } //如果输入的客户端信息不合法,尝试使保护期外的一个在线信息强制下线 DateTime onlineDateTime = PermissionArgs.GetInstance().OnlineDateTime; DateTime guardDateTime = PermissionArgs.GetInstance().GuardDateTime; //尝试强制下线1个连接。 var info = access.Update_Login_Log_Offline(account: account, count: 1, offline: 0, dateTimeUpdate_Start: onlineDateTime, dateTimeUpdate_End: guardDateTime, offlineFlag: true); if (info.GetData("Count").ToString().ToInt() == 1) { //如果强制下线成功,则登录现有连接。 clientPassword = access.Insert_Login_Log(account, clientFlag).GetData("ClientPassword").ToString(); return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户验证通过, PermissionVerifyMessage = "强制下线其他连接,用户验证通过并登录!" }); } else { if (PermissionArgs.GetInstance().OnlineCount == 1) { //如果没有将任何连接强制下线,则提示登录错误信息。 return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户已达到限制登录数量, PermissionVerifyMessage = "该用户已经登录,在保护期范围内不允许强制使其下线!" }); } else { //如果没有将任何连接强制下线,则提示登录错误信息。 return(new PermissionVerifyResultEntity() { PermissionVerifyState = Enum_PermissionVerifyState.用户处于登录保护期, PermissionVerifyMessage = "用户已达到限制登录数量,并且所有连接都处于登录保护期!" }); } } } if (co.PermissionVerifyState == Enum_PermissionVerifyState.用户登陆过多 && !string.IsNullOrEmpty(clientPassword)) { SetOffline(account, clientPassword); } return(co); } else { return(ul); } }