Beispiel #1
0
        /// <summary>
        /// 用户注销操作
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public string Logout(HttpContext context)
        {
            OperatorModel op = OperatorProvider.Provider.GetCurrent();

            //日志输出的对象,注销前先构造好,注销完成后,直接输入到日志
            BaseSysLogModel sysLog = new BaseSysLogModel();

            sysLog.F_System       = Configs.GetSetting("systemFlag");
            sysLog.F_Module       = "登录注销";
            sysLog.F_OptType      = "注销";
            sysLog.F_OptContent   = string.Format("用户{0}({1})注销系统。", op.UserName, op.UserCode);
            sysLog.F_CreateUserId = op.UserId;

            //删除掉当前session的登录记录信息
            string providerMsg = OperatorProvider.RemoveFromAllProvider();

            //删除掉当前session缓存的信息
            OperatorProvider.Provider.RemoveCurrent();
            if (!OperatorProvider.AllProvider.ContainsValue(providerMsg))   //该帐号注销后,检测是否还有该值得信息存在
            {
                userLoginBll.LogoutUpdate(op.LoginToken);
            }

            //记录注销登录日志
            SysLogProvider.GetInstance().WirteSysLog(sysLog);

            return(SuccessResult("注销成功!"));
        }
Beispiel #2
0
        /// <summary>
        /// 将日志写入到数据库的方法
        /// </summary>
        /// <param name="sysLogModel">系统传过来的日志信息</param>
        /// <returns></returns>
        public bool AddSysLog(BaseSysLogModel sysLogModel)
        {
            LogsModel model = sysLogModel.Copy<LogsModel>();

            var loginInfo = OperatorProvider.Provider.GetCurrent();
            if (loginInfo != null)
            {
                model.F_IPAddress = loginInfo.LoginIpAddress;
                model.F_IPCity = loginInfo.LoginIpAddressName;
            }

            return logsDal.AddForm(model);
        }
Beispiel #3
0
        /// <summary>
        /// 验证用户名密码,并检测是否运行登录。
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public string CheckLogin(HttpContext context)
        {
            string account    = context.Request["account"];
            string password   = context.Request["password"];
            string verify     = context.Request["verifyCode"];
            string forceLogin = context.Request["forceLogin"] ?? "false";

            //1、对验证码进行校验。
            if (!VerifyCode.Verify.CheckVerifyCode(verify))
            {
                return(ErrorResult(JsonRpcErrorEnum.BusinessError, "验证码错误。"));
            }

            //2、校验IP登录限制信息
            string thisIp = NetHelper.GetClientIp();
            //TODO 这里Ip限制待实现
            // FilterIPApp filterIpApp = new FilterIPApp();
            // if (!filterIpApp.CheckIpIsEnable(thisIp))
            // {
            //     throw new Exception("当前用户IP被禁止登录,请联系管理员。");
            // }

            //3、获取用户信息。
            UserModel user = userBll.GetUserByAccount(account);

            if (user == null)
            {
                return(ErrorResult(JsonRpcErrorEnum.BusinessError, "用户不存在!"));
            }
            if (user.F_DeleteFlag == 1)
            {
                return(ErrorResult(JsonRpcErrorEnum.BusinessError, "该用户已被删除!"));
            }

            //4、验证用户登录信息。
            UserLoginModel userLogin = userLoginBll.CheckLogin(user.F_Id, password);

            if (userLogin == null)
            {
                return(ErrorResult(JsonRpcErrorEnum.BusinessError, "用户登录验证失败,请重试!"));
            }

            //5、 单用户登录验证
            #region 单用户登录验证
            string allProviderValue = user.F_Id + "|" + userLogin.F_Id; //全局的用户信息缓存的内容
            if (userLogin.F_MultiUserLogin == 0)
            {
                List <string> nowSessionIds = OperatorProvider.AllProvider
                                              .Where(t => t.Value == allProviderValue)
                                              .Select(t => t.Key).ToList();
                if (nowSessionIds.Any())
                {
                    if (forceLogin == "false")
                    {
                        //如果已经登陆,则提示已经登陆,是否强制登录。
                        return(SuccessResult("hasLogin"));
                    }

                    //如果强制登录,则直接将其他登录用户修改为以下线状态
                    foreach (string nowSessionId in nowSessionIds)
                    {
                        MyLog.Debug(nowSessionId + "设置为强制下线");
                        OperatorProvider.AllProvider[nowSessionId] = "logout";
                    }
                }
            }

            #endregion

            //6、用户登录成功后,将登录的最新信息更新到数据库
            userLoginBll.LoginUpdate(userLogin);

            //7、缓存当前操作用户信息
            #region 缓存当前操作用户信息

            OperatorModel op = new OperatorModel();
            op.UserId             = user.F_Id;
            op.UserCode           = user.F_Account;      //帐号
            op.UserName           = user.F_NickName;     //昵称
            op.UserPhoto          = user.F_HeadIcon;     //头像
            op.CompanyId          = user.F_OrganizeId;   //组织架构
            op.DepartmentId       = user.F_DepartmentId; //部门
            op.RoleId             = user.F_RoleId;       //岗位
            op.LoginIpAddress     = thisIp;
            op.LoginIpAddressName = NetHelper.GetLocation(thisIp);
            //operate.LoginToken = DESEncrypt.Encrypt(Guid.NewGuid().ToString());
            op.LoginToken = userLogin.F_Id;
            op.LoginTime  = DateTime.Now;
            op.IsSystem   = Convert.ToBoolean(user.F_IsAdmin); //是否是管理员
            //这里判定是否是初始密码实现方案有两个:
            //1、 根据配置的默认密码与当前密码进行对比,进行提醒。但是如果配置修改后,对于之前的密码无法做到有效检测。
            //2、 根据密码修改的时间进行判定,如果密码修改时间不存在,则认为是未进行修改。此处采用这种。
            op.IsDefaultPwd = userLogin.F_ChangePassTime == null;

            OperatorProvider.Provider.AddCurrent(op);

            #endregion

            //8、将登陆信息缓存到整体变量中
            OperatorProvider.AddToAllProvider(allProviderValue);

            //9、记录系统登录日志
            BaseSysLogModel sysLog = new BaseSysLogModel();
            sysLog.F_System     = Configs.GetSetting("systemFlag");
            sysLog.F_Module     = "登录注销";
            sysLog.F_OptType    = "登录";
            sysLog.F_OptContent = string.Format("用户{0}({1})登录系统。", op.UserName, op.UserCode);
            SysLogProvider.GetInstance().WirteSysLog(sysLog);

            return(SuccessResult("true"));
        }