Пример #1
0
        public async Task <IActionResult> Login([FromBody] SysAdminLogin parm)
        {
            var apiRes = new ApiResult <string>()
            {
                statusCode = (int)ApiEnum.HttpRequestError
            };
            var token = "";

            try
            {
                ////获得公钥私钥,解密
                var rsaKey = MemoryCacheService.Default.GetCache <List <string> >("LOGINKEY_" + parm.number);
                if (rsaKey == null)
                {
                    apiRes.message = "登录失败,请刷新浏览器再次登录";
                    return(Ok(apiRes));
                }
                var ras = new RSACrypt(rsaKey[0], rsaKey[1]);
                parm.password = ras.Decrypt(parm.password);
            }
            catch (Exception ex)
            {
                apiRes.message    = ex.Message;
                apiRes.statusCode = (int)ApiEnum.Error;
            }
            apiRes.statusCode = (int)ApiEnum.Status;
            apiRes.data       = token;
            return(Ok(apiRes));
        }
Пример #2
0
        /// <summary>
        /// 用户登录实现
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <ApiResult <SysUserInfo> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysUserInfo>();

            parm.password = DES3Encrypt.EncryptString(parm.password);
            var model = db.Queryable <SysUserInfo>()
                        .Where(c => c.loginName == parm.loginname).First();

            if (model != null)
            {
                if (model.loginPWD.Equals(parm.password))
                {
                    //修改登录时间

                    //保存操作日志
                    res.success = true;
                    res.message = "获取成功";
                    res.data    = model;
                }
                else
                {
                    res.success    = false;
                    res.message    = "密码错误";
                    res.statusCode = (int)ApiEnum.Error;
                }
            }
            else
            {
                res.success    = false;
                res.statusCode = (int)ApiEnum.Error;
                res.message    = "账号错误~";
            }
            return(await Task.Run(() => res));
        }
Пример #3
0
        /// <summary>
        /// 用户登录实现
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <ApiResult <SysAdmin> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysAdmin>();

            try
            {
                parm.password = DES3Encrypt.EncryptString(parm.password);
                var model = Db.Queryable <SysAdmin>()
                            .Where(m => m.LoginName == parm.loginname).First();
                if (model != null)
                {
                    if (model.LoginPwd.Equals(parm.password))
                    {
                        //修改登录时间
                        model.LoginDate   = DateTime.Now;
                        model.UpLoginDate = model.LoginDate;
                        SysAdminDb.Update(model);

                        #region 保存操作日志
                        var logModel = new SysLog()
                        {
                            Guid        = Guid.NewGuid().ToString(),
                            LoginName   = model.LoginName,
                            DepartName  = model.DepartmentName,
                            OptionTable = "SysAdmin",
                            Summary     = "登录操作",
                            IP          = Utils.GetIp(),
                            LogType     = (int)LogEnum.Login,
                            Urls        = Utils.GetUrl(),
                            AddTime     = DateTime.Now
                        };
                        SysLogDb.Insert(logModel);
                        #endregion

                        res.success = true;
                        res.message = "获取成功!";
                        res.data    = model;
                    }
                    else
                    {
                        res.success    = false;
                        res.statusCode = (int)ApiEnum.Error;
                        res.message    = "密码错误~";
                    }
                }
                else
                {
                    res.success    = false;
                    res.statusCode = (int)ApiEnum.Error;
                    res.message    = "账号错误~";
                }
            }
            catch (Exception ex)
            {
                res.message    = ApiEnum.Error.GetEnumText() + ex.Message;
                res.statusCode = (int)ApiEnum.Error;
            }
            return(await Task.Run(() => res));
        }
Пример #4
0
        /// <summary>
        /// 用户登录实现
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <ApiResult <SysAdminMenuDto> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysAdminMenuDto>()
            {
                statusCode = (int)ApiEnum.Error
            };

            try
            {
                var adminModel = new SysAdminMenuDto();
                parm.password = DES3Encrypt.EncryptString(parm.password);
                var model = await Db.Queryable <SysAdmin>()
                            .Where(m => m.LoginName == parm.loginname).FirstAsync();

                if (model == null)
                {
                    res.message = "账号错误";
                    return(res);
                }
                if (!model.LoginPwd.Equals(parm.password))
                {
                    res.message = "密码错误~";
                    return(res);
                }
                if (!model.Status)
                {
                    res.message = "登录账号被冻结,请联系管理员~";
                    return(res);
                }
                adminModel.menu = GetMenuByAdmin(model.Guid);
                if (adminModel == null)
                {
                    res.message = "当前账号没有授权功能模块,无法登录~";
                    return(res);
                }
                //修改登录时间
                model.LoginDate   = DateTime.Now;
                model.UpLoginDate = model.LoginDate;
                model.LoginSum    = model.LoginSum + 1;
                SysAdminDb.Update(model);



                res.statusCode   = (int)ApiEnum.Status;
                adminModel.admin = model;
                res.data         = adminModel;
            }
            catch (Exception ex)
            {
                res.message = ex.Message;
                Logger.Default.ProcessError((int)ApiEnum.Error, ex.Message);
            }
            return(res);
        }
Пример #5
0
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="parm">登录信息参数</param>
        /// <param name="privateKey">加密私钥</param>
        /// <param name="publicKey">加密公钥</param>
        /// <returns></returns>
        public async Task <IActionResult> OnPostLoginAsync(SysAdminLogin parm, string privateKey, string publicKey)
        {
            var apiRes = new ApiResult <Core.Model.Sys.SysAdmin>();
            var token  = "";

            try
            {
                //Ras解密密码
                var ras = new RSACrypt(privateKey, publicKey);
                parm.password = ras.Decrypt(parm.password);
                //查询登录结果
                apiRes = _sysAdminService.LoginAsync(parm).Result;
                var user = apiRes.data;
                if (apiRes.statusCode == 200)
                {
                    var identity = new ClaimsPrincipal(
                        new ClaimsIdentity(new[]
                    {
                        new Claim(ClaimTypes.Sid, user.Guid),
                        new Claim(ClaimTypes.Role, user.DepartmentName),
                        new Claim(ClaimTypes.Thumbprint, user.HeadPic),
                        new Claim(ClaimTypes.Name, user.TrueName),
                        new Claim(ClaimTypes.WindowsAccountName, user.LoginName),
                        new Claim(ClaimTypes.UserData, user.UpLoginDate.ToString()),
                    }, CookieAuthenticationDefaults.AuthenticationScheme)
                        );
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                    {
                        ExpiresUtc   = DateTime.UtcNow.AddHours(2),
                        IsPersistent = true,
                        AllowRefresh = false
                    });

                    var tm = new TokenModel()
                    {
                        Uid       = Guid.NewGuid().ToString(),
                        Role      = "Admin",
                        Project   = "Manage",
                        TokenType = "Web"
                    };
                    token = JwtHelper.IssueJWT(tm);
                }
            }
            catch (Exception ex)
            {
                apiRes.message    = ex.Message;
                apiRes.statusCode = (int)ApiEnum.Error;
            }

            return(new JsonResult(new ApiResult <string>()
            {
                statusCode = apiRes.statusCode, message = apiRes.message, data = token
            }));
        }
Пример #6
0
        /// <summary>
        /// 登录验证
        /// </summary>
        /// <param name="model">接收数据</param>
        /// <returns></returns>
        public ActionResult LoginSysAdminSave(SysAdmin model)
        {
            var state = false;
            var db    = new HotelDatabase();

            if (ModelState.IsValid)
            {
                db.Database.CreateIfNotExists();

                var lst = db.SysAdmins.AsQueryable();
                lst = lst.Where(o => o.SysAdminName.Contains(model.SysAdminName));
                foreach (var q in lst)
                {
                    if (q.SysAdminName == model.SysAdminName && q.SysAdminPassword == model.SysAdminPassword)
                    {
                        state = true;
                    }
                    else
                    {
                        state = false;
                    }
                }
            }
            if (state == true)
            {
                try
                {
                    var stateLogin = new SysAdminLogin();
                    stateLogin.SysAdminLoginState = "true";
                    stateLogin.SysAdminName       = model.SysAdminName;
                    ViewBag.SysAdminName          = model.SysAdminName;
                    db.SysAdminLogins.Add(stateLogin);
                    db.SaveChanges();

                    return(RedirectToAction("OrderListIndex", "BackstageManage"));
                }
                catch (ArgumentNullException e)
                {
                    return(Content("<script> alert('该账号已登录!'); </script>"));
                }
            }
            else
            {
                return(View("LoginSysAdmin"));
            }
        }
Пример #7
0
        public async Task <ApiResult <SysAdminMenuDto> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysAdminMenuDto>()
            {
                statusCode = (int)ApiEnum.Error
            };

            try
            {
                var adminModel = new SysAdminMenuDto();
                parm.password = parm.password;
                var model = await Db.Queryable <SysAdmin>()
                            .Where(m => m.LoginName == parm.loginname).FirstAsync();

                if (model == null)
                {
                    res.message = "账号错误";
                    return(res);
                }
                if (!model.LoginPwd.Equals(parm.password))
                {
                    res.message = "密码错误~";
                    return(res);
                }
                if (!model.Status)
                {
                    res.message = "登录账号被冻结,请联系管理员~";
                    return(res);
                }
                adminModel.menu = GetMenuByAdmin(model.Guid);
                if (adminModel == null)
                {
                    res.message = "当前账号没有授权功能模块,无法登录~";
                    return(res);
                }
            }
            catch (Exception)
            {
                res = null;
            }
            return(res);
        }
Пример #8
0
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <IActionResult> OnPostLoginAsync(SysAdminLogin parm)
        {
            var apiRes = _sysAdminService.LoginAsync(parm);

            try
            {
                var user = apiRes.Result.data;
                if (apiRes.Result.statusCode == 200)
                {
                    var identity = new ClaimsPrincipal(
                        new ClaimsIdentity(new[]
                    {
                        new Claim(ClaimTypes.Sid, user.Guid),
                        new Claim(ClaimTypes.Role, "超级管理员"),
                        new Claim(ClaimTypes.Thumbprint, user.HeadPic),
                        new Claim(ClaimTypes.Name, user.TrueName),
                        new Claim(ClaimTypes.WindowsAccountName, user.LoginName),
                        new Claim(ClaimTypes.UserData, user.UpLoginDate.ToString()),
                    }, CookieAuthenticationDefaults.AuthenticationScheme)
                        );
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                    {
                        ExpiresUtc   = DateTime.UtcNow.AddMinutes(60),
                        IsPersistent = true,
                        AllowRefresh = false
                    });
                }
            }
            catch (Exception ex)
            {
                apiRes.Result.message    = ex.Message;
                apiRes.Result.statusCode = (int)ApiEnum.Error;
            }

            return(new JsonResult(new ApiResult <string>()
            {
                statusCode = apiRes.Result.statusCode, message = apiRes.Result.message
            }));
        }
Пример #9
0
        /// <summary>
        /// 用户登录实现
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <ApiResult <SysAdmin> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysAdmin>();

            try
            {
                parm.password = DES3Encrypt.EncryptString(parm.password);
                var model = Db.Queryable <SysAdmin>()
                            .Where(m => m.LoginName == parm.loginname).First();
                if (model != null)
                {
                    if (model.LoginPwd.Equals(parm.password))
                    {
                        res.success = true;
                        res.message = "获取成功!";
                        res.data    = model;
                    }
                    else
                    {
                        res.success    = false;
                        res.statusCode = (int)ApiEnum.Error;
                        res.message    = "密码错误~";
                    }
                }
                else
                {
                    res.success    = false;
                    res.statusCode = (int)ApiEnum.Error;
                    res.message    = "账号错误~";
                }
            }
            catch (Exception ex)
            {
                res.message    = ApiEnum.Error.GetEnumText() + ex.Message;
                res.statusCode = (int)ApiEnum.Error;
            }
            return(await Task.Run(() => res));
        }
Пример #10
0
        public async Task <IActionResult> Login([FromBody] SysAdminLogin parm)
        {
            var apiRes = new ApiResult <string>()
            {
                statusCode = (int)ApiEnum.HttpRequestError
            };
            var token = "";

            try
            {
                //获得公钥私钥,解密
                var rsaKey = MemoryCacheService.Default.GetCache <List <string> >("LOGINKEY");
                if (rsaKey == null)
                {
                    apiRes.message = "登录失败,请刷新浏览器再次登录";
                    return(Ok(apiRes));
                }
                //Ras解密密码
                var ras = new RSACrypt(rsaKey[0], rsaKey[1]);
                parm.password = ras.Decrypt(parm.password);

                //获得用户登录限制次数
                var configLoginCount = Convert.ToInt32(ConfigExtensions.Configuration[KeyHelper.LOGINCOUNT]);
                //获得登录次数和过期时间
                var loginConfig = MemoryCacheService.Default.GetCache <SysAdminLoginConfig>(KeyHelper.LOGINCOUNT) ?? new SysAdminLoginConfig();
                if (loginConfig.Count != 0 && loginConfig.DelayMinute != null)
                {
                    //说明存在过期时间,需要判断
                    if (DateTime.Now <= loginConfig.DelayMinute)
                    {
                        apiRes.message = "您的登录以超过设定次数,请稍后再次登录~";
                        return(Ok(apiRes));
                    }
                    else
                    {
                        //已经过了登录的预设时间,重置登录配置参数
                        loginConfig.Count       = 0;
                        loginConfig.DelayMinute = null;
                    }
                }
                //查询登录结果
                var dbres = await _adminService.LoginAsync(parm);

                if (dbres.statusCode != 200)
                {
                    //增加登录次数
                    loginConfig.Count += 1;
                    //登录的次数大于配置的次数,则提示过期时间
                    if (loginConfig.Count == configLoginCount)
                    {
                        var configDelayMinute = Convert.ToInt32(ConfigExtensions.Configuration[KeyHelper.LOGINDELAYMINUTE]);
                        //记录过期时间
                        loginConfig.DelayMinute = DateTime.Now.AddMinutes(configDelayMinute);
                        apiRes.message          = "登录次数超过" + configLoginCount + "次,请" + configDelayMinute + "分钟后再次登录";
                        return(Ok(apiRes));
                    }
                    //记录登录次数,保存到session
                    MemoryCacheService.Default.SetCache(KeyHelper.LOGINCOUNT, loginConfig);
                    //提示用户错误和登录次数信息
                    apiRes.message = dbres.message + "  您还剩余" + (configLoginCount - loginConfig.Count) + "登录次数";
                    return(Ok(apiRes));
                }

                var user     = dbres.data.admin;
                var identity = new ClaimsPrincipal(
                    new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.Sid, user.Guid),
                    new Claim(ClaimTypes.Role, user.DepartmentName),
                    new Claim(ClaimTypes.Thumbprint, user.HeadPic),
                    new Claim(ClaimTypes.Name, user.LoginName),
                    new Claim(ClaimTypes.WindowsAccountName, user.LoginName),
                    new Claim(ClaimTypes.UserData, user.UpLoginDate.ToString())
                }, CookieAuthenticationDefaults.AuthenticationScheme)
                    );
                //如果保存用户类型是Session,则默认设置cookie退出浏览器 清空
                if (ConfigExtensions.Configuration[KeyHelper.LOGINSAVEUSER] == "Session")
                {
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                    {
                        AllowRefresh = false
                    });
                }
                else
                {
                    //根据配置保存浏览器用户信息,小时单位
                    var hours = int.Parse(ConfigExtensions.Configuration[KeyHelper.LOGINCOOKIEEXPIRES]);
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                    {
                        ExpiresUtc   = DateTime.UtcNow.AddHours(hours),
                        IsPersistent = true,
                        AllowRefresh = false
                    });
                }
                //获得第一条站点,并保存到session中
                var site = await _siteService.GetListAsync(m => !m.IsDel, m => m.AddTime, DbOrderEnum.Asc);

                //把权限存到缓存里
                var menuSaveType = ConfigExtensions.Configuration[KeyHelper.LOGINAUTHORIZE];
                if (menuSaveType == "Redis")
                {
                    RedisHelper.Set(KeyHelper.ADMINMENU + "_" + dbres.data.admin.Guid, dbres.data.menu);
                    RedisHelper.Set(KeyHelper.NOWSITE, site.data.FirstOrDefault());
                }
                else
                {
                    MemoryCacheService.Default.SetCache(KeyHelper.NOWSITE, site.data.FirstOrDefault());
                    MemoryCacheService.Default.SetCache(KeyHelper.ADMINMENU + "_" + dbres.data.admin.Guid, dbres.data.menu, 600);
                }
                token = JwtHelper.IssueJWT(new TokenModel()
                {
                    Uid       = user.Guid,
                    UserName  = user.LoginName,
                    Role      = "Admin",
                    TokenType = "Web"
                });
                MemoryCacheService.Default.RemoveCache("LOGINKEY");
                MemoryCacheService.Default.RemoveCache(KeyHelper.LOGINCOUNT);

                #region 保存日志
                var agent = HttpContext.Request.Headers["User-Agent"];
                var log   = new SysLog()
                {
                    Guid     = Guid.NewGuid().ToString(),
                    Logged   = DateTime.Now,
                    Logger   = LogEnum.LOGIN.GetEnumText(),
                    Level    = "Info",
                    Message  = "登录:" + parm.loginname,
                    Callsite = "/fytadmin/login",
                    IP       = Utils.GetIp(),
                    User     = parm.loginname,
                    Browser  = agent.ToString()
                };
                await _logService.AddAsync(log);

                #endregion
            }
            catch (Exception ex)
            {
                apiRes.message    = ex.Message;
                apiRes.statusCode = (int)ApiEnum.Error;

                #region 保存日志
                var agent = HttpContext.Request.Headers["User-Agent"];
                var log   = new SysLog()
                {
                    Guid      = Guid.NewGuid().ToString(),
                    Logged    = DateTime.Now,
                    Logger    = LogEnum.LOGIN.GetEnumText(),
                    Level     = "Error",
                    Message   = "登录失败!" + ex.Message,
                    Exception = ex.Message,
                    Callsite  = "/fytadmin/login",
                    IP        = Utils.GetIp(),
                    User      = parm.loginname,
                    Browser   = agent.ToString()
                };
                await _logService.AddAsync(log);

                #endregion
            }
            apiRes.statusCode = (int)ApiEnum.Status;
            apiRes.data       = token;
            return(Ok(apiRes));
        }
Пример #11
0
        /// <summary>
        /// 用户登录实现
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <ApiResult <SysAdmin> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysAdmin>();

            try
            {
                parm.password = DES3Encrypt.EncryptString(parm.password);

                var model = DbContext._.Db.From <SysAdmin>().Where(d => d.LoginName == parm.loginname).ToFirstDefault();
                if (model != null)
                {
                    if (!model.Status)
                    {
                        res.success    = false;
                        res.statusCode = (int)ApiEnum.Error;
                        res.message    = "账号冻结~";
                    }
                    else
                    {
                        if (model.LoginPwd.Equals(parm.password))
                        {
                            //修改登录时间
                            model.LoginDate   = DateTime.Now;
                            model.UpLoginDate = model.LoginDate;
                            //SysAdminDb.Update(model);
                            DbContext._.Db.Update <SysAdmin>(model, d => d.Guid == model.Guid);

                            #region 保存操作日志
                            //var logModel = new SysLog()
                            //{
                            //    Guid = Guid.NewGuid().ToString(),
                            //    LoginName = model.LoginName,
                            //    DepartName = model.DepartmentName,
                            //    OptionTable = "SysAdmin",
                            //    Summary = "登录操作",
                            //    IP = Utils.GetIp(),
                            //    LogType = (int)LogEnum.Login,
                            //    Urls = Utils.GetUrl(),
                            //    AddTime = DateTime.Now
                            //};
                            //SysLogDb.Insert(logModel);
                            #endregion

                            res.success = true;
                            res.message = "获取成功!";
                            res.data    = model;
                        }
                        else
                        {
                            res.success    = false;
                            res.statusCode = (int)ApiEnum.Error;
                            res.message    = "密码错误~";
                        }
                    }
                }
                else
                {
                    res.success    = false;
                    res.statusCode = (int)ApiEnum.Error;
                    res.message    = "账号错误~";
                }
            }
            catch (Exception ex)
            {
                res.message    = ApiEnum.Error.GetEnumText() + ex.Message;
                res.statusCode = (int)ApiEnum.Error;
            }
            return(await Task.Run(() => res));
        }
Пример #12
0
        public async Task <ApiResult <string> > Login([FromBody] SysAdminLogin parm)
        {
            var apiRes = new ApiResult <string>()
            {
                statusCode = (int)ApiEnum.HttpRequestError
            };
            var token = "";

            try
            {
                #region 1. 从缓存获取公钥私钥解密,再解密密码

                //获得公钥私钥,解密
                var rsaKey = MemoryCacheHelper.Get <List <string> >(KeyModel.LoginKey);
                if (rsaKey == null)
                {
                    apiRes.msg = "登录失败,请刷新浏览器再次登录";
                    return(apiRes);
                }
                //Ras解密密码
                var ras = new RSAEncrypt(rsaKey[0], rsaKey[1]);
                parm.password = ras.Decrypt(parm.password);

                #endregion

                #region 2. 判断用户登录次数限制以及过期时间

                //获得用户登录限制次数
                var configLoginCount = Convert.ToInt32(Appsettings.Configuration[KeyModel.LoginCount]);
                //获得登录次数和过期时间
                SysAdminLoginConfig loginConfig = MemoryCacheHelper.Get <SysAdminLoginConfig>(KeyModel.LoginCount) ?? new SysAdminLoginConfig();
                if (loginConfig.Count != 0 && loginConfig.DelayMinute != null)
                {
                    //说明存在过期时间,需要判断
                    if (DateTime.Now <= loginConfig.DelayMinute)
                    {
                        apiRes.msg = "您的登录以超过设定次数,请稍后再次登录~";
                        return(apiRes);
                    }
                    else
                    {
                        //已经过了登录的预设时间,重置登录配置参数
                        loginConfig.Count       = 0;
                        loginConfig.DelayMinute = null;
                    }
                }
                #endregion

                #region 3. 从数据库查询该用户

                //查询登录结果
                var dbres = _adminService.LoginAsync(parm).Result;
                if (dbres.statusCode != 200)
                {
                    //增加登录次数
                    loginConfig.Count += 1;
                    //登录的次数大于配置的次数,则提示过期时间
                    if (loginConfig.Count == configLoginCount)
                    {
                        var configDelayMinute = Convert.ToInt32(Appsettings.Configuration[KeyModel.LogindElayMinute]);
                        //记录过期时间
                        loginConfig.DelayMinute = DateTime.Now.AddMinutes(configDelayMinute);
                        apiRes.msg = "登录次数超过" + configLoginCount + "次,请" + configDelayMinute + "分钟后再次登录";
                        return(apiRes);
                    }
                    //记录登录次数,保存到session
                    MemoryCacheHelper.Set(KeyModel.LoginCount, loginConfig);
                    //提示用户错误和登录次数信息
                    apiRes.msg = dbres.msg + "  您还剩余" + (configLoginCount - loginConfig.Count) + "登录次数";
                    return(apiRes);
                }

                #endregion

                #region 4. 设置Identity User信息

                var user     = dbres.data.admin;
                var identity = new ClaimsPrincipal(
                    new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.Sid, user.ID),
                    new Claim(ClaimTypes.Role, user.RoleId),
                    new Claim(ClaimTypes.Thumbprint, user.HeadPic),
                    new Claim(ClaimTypes.Name, user.RelName),
                    new Claim(ClaimTypes.WindowsAccountName, user.Account),
                    new Claim(ClaimTypes.UserData, user.LastLoginTime.ToString())
                }, CookieAuthenticationDefaults.AuthenticationScheme)
                    );
                if (Appsettings.Configuration[KeyModel.LoginSaveUser] == "Session")
                {//如果保存用户类型是Session,则默认设置cookie退出浏览器 清空,并且保存用户信息
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                    {
                        AllowRefresh = false
                    });
                }
                else
                {
                    //根据配置保存浏览器用户信息,小时单位
                    var hours = int.Parse(Appsettings.Configuration[KeyModel.LoginCookieExpires]);
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                    {
                        ExpiresUtc   = DateTime.UtcNow.AddHours(hours),
                        IsPersistent = true,
                        AllowRefresh = false
                    });
                }
                #endregion

                #region 5. 保存权限信息到缓存
                if (dbres.data.menu != null)
                {
                    var menuSaveType = Appsettings.Configuration[KeyModel.LoginAuthorize];
                    if (menuSaveType == "Redis")
                    {
                        RedisCacheHelper.Set(KeyModel.AdminMenu + "_" + dbres.data.admin.ID, dbres.data.menu);
                    }
                    else
                    {
                        MemoryCacheHelper.Set(KeyModel.AdminMenu + "_" + dbres.data.admin.ID, dbres.data.menu);
                    }
                }
                #endregion

                #region 6. 生成token信息,并且返回给前端

                token = JwtHelper.IssueToken(new TokenModel()
                {
                    UserID      = user.ID,
                    UserName    = user.RelName,
                    UserAccount = user.Account,
                    Role        = "AdminPolicy",
                    ProjectName = "DL.Admin"
                });
                MemoryCacheHelper.Del <string>(KeyModel.LoginKey);
                MemoryCacheHelper.Del <string>(KeyModel.LoginCount);

                #endregion

                #region 7. 保存日志

                var agent = HttpContext.Request.Headers["User-Agent"];
                var log   = new SysLog()
                {
                    ID         = Guid.NewGuid().ToString(),
                    CreateTime = DateTime.Now,
                    Layer      = 1,
                    Message    = "登录",
                    Url        = "/Login/Login",
                    IP         = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(),
                    Account    = parm.loginname,
                    Browser    = agent.ToString()
                };
                await _logService.AddAsync(log);

                #endregion
            }
            catch (Exception ex)
            {
                apiRes.msg        = ex.Message;
                apiRes.statusCode = (int)ApiEnum.Error;

                #region 保存日志
                var agent = HttpContext.Request.Headers["User-Agent"];
                var log   = new SysLog()
                {
                    ID         = Guid.NewGuid().ToString(),
                    CreateTime = DateTime.Now,
                    Layer      = 4,
                    Message    = "登录失败!" + ex.Message,
                    Exception  = ex.Message,
                    Url        = "/Login/Login",
                    IP         = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(),
                    Account    = parm.loginname,
                    Browser    = agent.ToString()
                };
                await _logService.AddAsync(log);

                #endregion
            }

            apiRes.statusCode = (int)ApiEnum.Status;
            apiRes.data       = token;
            return(apiRes);
        }
Пример #13
0
 public async Task <ApiResult <SysAdmin> > LoginAsync(SysAdminLogin parm)
 {
     return(await _adminService.LoginAsync(parm));
 }
Пример #14
0
        public async Task <IActionResult> Login([FromBody] SysAdminLogin parm)
        {
            var res = new ApiResult <string>()
            {
                statusCode = (int)ApiEnum.HttpRequestError
            };

            try
            {
                //获得公钥私钥,解密
                var rsaKey = await _cache.GetAsync <List <string> >($"LOGINKEY:{parm.lid}");

                if (rsaKey == null)
                {
                    res.message = "登录失败,请刷新浏览器再次登录";
                    return(Ok(res));
                }
                //Ras解密密码
                var ras = new RSACrypt(rsaKey[0], rsaKey[1]);
                parm.password = ras.Decrypt(parm.password);

                //获得用户登录限制次数
                var configLoginCount = Convert.ToInt32(_config[KeyHelper.LOGINCOUNT]);
                //获得登录次数和过期时间
                var loginConfig = await _cache.GetAsync <SysAdminLoginConfig>(KeyHelper.LOGINCOUNT) ?? new SysAdminLoginConfig();

                if (loginConfig.Count != 0 && loginConfig.DelayMinute != null)
                {
                    //说明存在过期时间,需要判断
                    if (DateTime.Now <= loginConfig.DelayMinute)
                    {
                        res.message = "您的登录以超过设定次数,请稍后再次登录~";
                        return(Ok(res));
                    }
                    else
                    {
                        //已经过了登录的预设时间,重置登录配置参数
                        loginConfig.Count       = 0;
                        loginConfig.DelayMinute = null;
                    }
                }

                #region 验证码

                var captcha = new SimpleCaptcha();
                if (!captcha.Validate(parm.code, parm.cid))
                {
                    res.message    = "验证码错误";
                    res.statusCode = (int)ApiEnum.ParameterError;
                    return(Ok(res));
                }

                #endregion

                //查询登录结果
                var dbres = await _adminService.LoginAsync(parm);

                if (dbres.statusCode != 200)
                {
                    //增加登录次数
                    loginConfig.Count += 1;
                    //登录的次数大于配置的次数,则提示过期时间
                    if (loginConfig.Count == configLoginCount)
                    {
                        var configDelayMinute = Convert.ToInt32(_config[KeyHelper.LOGINDELAYMINUTE]);
                        //记录过期时间
                        loginConfig.DelayMinute = DateTime.Now.AddMinutes(configDelayMinute);
                        res.message             = "登录次数超过" + configLoginCount + "次,请" + configDelayMinute + "分钟后再次登录";
                        return(Ok(res));
                    }
                    //记录登录次数,保存到session
                    await _cache.SetAsync(KeyHelper.LOGINCOUNT, loginConfig);

                    //提示用户错误和登录次数信息
                    res.message = dbres.message;
                    return(Ok(res));
                }

                var user     = dbres.data.admin;
                var identity = new ClaimsPrincipal(
                    new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.PrimarySid, user.IsSystem.ToString()),
                    new Claim(ClaimTypes.Sid, user.Guid),
                    new Claim(ClaimTypes.Role, "授权用户"),
                    new Claim(ClaimTypes.Name, user.TrueName),
                    new Claim(ClaimTypes.WindowsAccountName, user.LoginName),
                    new Claim(ClaimTypes.UserData, user.UpLoginDate.ToString())
                }, CookieAuthenticationDefaults.AuthenticationScheme)
                    );

                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity);

                ////如果保存用户类型是Session,则默认设置cookie退出浏览器 清空
                //if (_config[KeyHelper.LOGINSAVEUSER] == "Session")
                //{
                //    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                //    {
                //        AllowRefresh = false
                //    });
                //}
                //else
                //{
                //    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
                //    {
                //        ExpiresUtc = DateTime.UtcNow.AddHours(_config.GetValue(KeyHelper.LOGINCOOKIEEXPIRES, 0.5D)),
                //        IsPersistent = true,
                //        AllowRefresh = false
                //    });
                //}

                //把权限存到缓存里
                await _cache.SetAsync(KeyHelper.ADMINMENU + "_" + dbres.data.admin.Guid, dbres.data.menu);

                res.data = JwtHelper.IssueJWT(new TokenModel()
                {
                    Uid       = user.Guid,
                    UserName  = user.LoginName,
                    Role      = "Admin",
                    TokenType = "Web"
                });
                await _cache.RemoveAsync($"LOGINKEY:{parm.lid}");

                await _cache.RemoveAsync(KeyHelper.LOGINCOUNT);

                #region 保存日志
                var agent = HttpContext.Request.Headers["User-Agent"];
                var log   = new SysLog()
                {
                    Guid     = Guid.NewGuid().ToString(),
                    Logged   = DateTime.Now,
                    Logger   = LogEnum.LOGIN.GetEnumText(),
                    Level    = "Info",
                    Message  = "登录:" + parm.loginname,
                    Callsite = "/fytadmin/login",
                    IP       = HttpContext.GetIP(),
                    User     = parm.loginname,
                    Browser  = agent.ToString()
                };
                await _logService.AddAsync(log);

                #endregion
            }
            catch (CryptographicException)
            {
                res.message    = "登录失败,请刷新浏览器重试";
                res.statusCode = (int)ApiEnum.Error;
                return(Ok(res));
            }
            catch (Exception ex)
            {
                var agent = HttpContext.Request.Headers["User-Agent"];
                var log   = new SysLog()
                {
                    Guid      = Guid.NewGuid().ToString(),
                    Logged    = DateTime.Now,
                    Logger    = LogEnum.LOGIN.GetEnumText(),
                    Level     = "Error",
                    Message   = "登录失败!" + ex.Message,
                    Exception = ex.ToString(),
                    Callsite  = "/fytadmin/login",
                    IP        = HttpContext.GetIP(),
                    User      = parm.loginname,
                    Browser   = agent.ToString()
                };
                await _logService.AddAsync(log);

                res.message    = "登录失败,请刷新浏览器重试";
                res.statusCode = (int)ApiEnum.Error;
                return(Ok(res));
            }

            res.statusCode = (int)ApiEnum.Status;

            return(Ok(res));
        }
Пример #15
0
        /// <summary>
        /// 用户登录实现
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        public async Task <ApiResult <SysAdminMenuDto> > LoginAsync(SysAdminLogin parm)
        {
            var res = new ApiResult <SysAdminMenuDto>()
            {
                statusCode = (int)ApiEnum.Error
            };

            try
            {
                var adminModel = new SysAdminMenuDto();
                parm.password = DES3Encrypt.EncryptString(parm.password);
                var model = await Db.Queryable <SysAdmin>().Where(m => m.LoginName == parm.loginname).FirstAsync();

                if (model == null)
                {
                    res.message = "账号错误";
                    return(res);
                }
                if (!model.LoginPwd.Equals(parm.password))
                {
                    res.message = "密码错误~";
                    return(res);
                }
                if (!model.Status)
                {
                    res.message = "登录账号被冻结,请联系管理员~";
                    return(res);
                }
                var(isSystem, isAgent, isSubAdmin) = await roleService.GetRoleByAdminGuid(model.Guid);

                if (isSystem)
                {
                }
                else if (isAgent)
                {
                    var exist = await Db.Queryable <CmsAgent>().AnyAsync(p => p.Admin_Guid == model.Guid && p.Status);

                    if (!exist)
                    {
                        res.message = "代理商已经被冻结,请联系管理员";
                        return(res);
                    }
                }
                else if (isSubAdmin)
                {
                    var exist = await Db.Queryable <CmsMerchant>().AnyAsync(p => p.admin_guid == model.Guid && p.status);

                    if (!exist)
                    {
                        res.message = "商户已经被冻结,请联系管理员";
                        return(res);
                    }
                }
                else
                {
                    var exist = await Db.Queryable <CmsMerchant>().AnyAsync(p => p.admin_guid == model.CreateBy && p.status);

                    if (!exist)
                    {
                        res.message = "商户已经被冻结,请联系管理员";
                        return(res);
                    }
                }

                adminModel.menu = GetMenuByAdmin(model.Guid);
                if (adminModel == null)
                {
                    res.message = "当前账号没有授权功能模块,无法登录~";
                    return(res);
                }

                //修改登录时间
                model.LoginDate   = DateTime.Now;
                model.UpLoginDate = model.LoginDate;
                model.LoginSum    = model.LoginSum + 1;
                SysAdminDb.Update(model);

                var roleList = await Db.Queryable <SysRole>().Where(m => m.IsSystem).Select(m => m.Guid).ToListAsync();

                model.IsSystem = roleList.Intersect(model.RoleList.Select(p => p.guid)).Any();

                res.statusCode   = (int)ApiEnum.Status;
                adminModel.admin = model;
                res.data         = adminModel;
            }
            catch (Exception ex)
            {
                res.message = ex.Message;
                Logger.Default.ProcessError((int)ApiEnum.Error, ex.Message);
            }
            return(res);
        }