Exemple #1
0
        /// <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 = "允许用户继续登录。"
                });
            }
        }
Exemple #2
0
        /// <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 = "客户端密码验证通过!"
            });
        }
Exemple #3
0
        /// <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 = "允许用户访问该地址。"
                });
            }
        }
Exemple #4
0
        /// <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);
            }
        }