/// <summary> /// 管理员登录。 /// 1、登录失败,记录登录错误次数,记录登录日志。 /// 2、登录成功,清空登录错误次数,记录登录日志。 /// </summary> /// <param name="adminName"></param> /// <param name="adminPassword">明文密码</param> /// <param name="manageCode">管理认证码</param> /// <param name="isCheckManageCode">是否启用管理认证码检查</param> /// <returns></returns> public async Task <IdentityResult> Login(string adminName, string adminPassword, string manageCode = "", bool isCheckManageCode = true) { //检查管理认证码 if (isCheckManageCode) { SiteOptionConfig siteOptionConfig = ConfigHelper.Get <SiteOptionConfig>(); if (siteOptionConfig.EnableSiteManageCode && (manageCode.Trim() != siteOptionConfig.SiteManageCode)) { await _repository.CumulativeLoginErrTimes(adminName); return(new IdentityResult("您输入的管理认证码不正确,请重新输入。")); } } //得到实体 AdminEntity admin = await _repository.GetEntityAsync(adminName, adminPassword); if (admin == null || admin.AdminID <= 0) { await _repository.CumulativeLoginErrTimes(adminName); _LogRepository.SaveLog("管理员登录失败!用户名:" + adminName, "输入的用户名或密码不正确", adminName, LogCategory.LogOnFailure, LogPriority.Highest); return(new IdentityResult("您输入的用户名或密码不正确,请重新输入。")); } //检查是否锁定 if (admin.IsLock) { _LogRepository.SaveLog("管理员登录失败!用户名:" + adminName, "账号已锁定", adminName, LogCategory.LogOnFailure, LogPriority.Highest); return(new IdentityResult("账号已锁定。")); } //检查密码的HASH值 bool isHash = await _repository.AuthenticatePassHash(adminName); if (!isHash) { await _repository.CumulativeLoginErrTimes(adminName); _LogRepository.SaveLog("管理员登录失败!用户名:" + adminName, "登录失败,数据被非法修改,请检查数据的有效性!", adminName, LogCategory.LogOnFailure, LogPriority.Highest); return(new IdentityResult("数据被非法修改,请检查数据的有效性!")); } //重置登录错误次数、记录登录成功日志、创建返回类 admin.LoginErrorTimes = 0; admin.LoginTimes += 1; admin.LoginTime = DateTime.Now; admin.LoginIP = Utility.GetClientIP(); admin.RndPassword = DataSecurity.MakeRandomString(16); await _repository.UpdateAsync(admin); _LogRepository.SaveLog("管理员登录成功!用户名:" + adminName, "管理员登录成功", adminName, LogCategory.LogOnOk); return(new IdentityResult(CreateClaimsIdentity(admin))); }
/// <summary> /// 使用sha1方式对字符串进行加密,主要用于对登录密码的再次加密,以防止破解。 /// 1、在密码后加入SiteOption.SiteHashCode字符串。 /// 2、使用 sha1 加密。 /// </summary> /// <param name="adminPassword">管理员密码(已经被MD5加密)</param> /// <returns></returns> public async Task <string> GetAuthenticatePassHash(string adminPassword) { SiteOptionConfig siteOptionConfig = ConfigHelper.Get <SiteOptionConfig>(); return(await Task.Run(() => Sha1.Encrypt(adminPassword + siteOptionConfig.SiteHashCode))); }