using System; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web; using System.Web.Http; using Common.Logging; using Learun.Application.Base.AuthorizeModule; using Learun.Application.Base.SystemModule; using Learun.Application.Organization; using Learun.Loger; using Learun.Util; using Learun.Util.Operat; using Learun.Util.SqlSugar; using log4net.Config; namespace Learun.Application.Web.AppApi { /// /// 登录 /// [RoutePrefix("api/LoginApi")] [HandlerApiLogin(FilterMode.Ignore)] public class LoginApiController : WebApiControllerBase { #region 模块对象 private UserIBLL userBll = new UserBLL(); #endregion /// /// 查看system.config中的初始密码 /// /// /// /// [HttpGet] public IHttpActionResult GetInitialPassword() { var res = Config.GetValue("InitialPassword", "000000").ToString(); return Success(res); } /// /// 用户名、密码登录 /// /// 用户名 /// 密码(md5加密) /// [HttpGet] public IHttpActionResult CheckLogin(string username, string password) { try { #region 测试用,因为NET6的前端,有的用不了MD5 MD5 md5 = MD5.Create(); byte[] buffer = Encoding.UTF8.GetBytes(password);//将字符串转成字节数组 byte[] byteArray = md5.ComputeHash(buffer);//调用加密方法 StringBuilder sb = new StringBuilder(); foreach (byte b in byteArray)//遍历字节数组 { sb.Append(b.ToString("x2"));//将字节数组转成16进制的字符串。X表示16进制,2表示每个16字符占2位 } //password = sb.ToString(); 注释掉之后就是原本的机制 #endregion #region 内部账户验证 UserEntity userEntity = userBll.CheckLogin(username, password); #region 写入日志 LogEntity logEntity = new LogEntity(); logEntity.F_CategoryId = 1; logEntity.F_OperateTypeId = ((int)OperationType.Login).ToString(); logEntity.F_OperateType = EnumAttribute.GetDescription(OperationType.Login); logEntity.F_OperateAccount = username + "(" + userEntity.F_RealName + ")"; logEntity.F_OperateUserId = !string.IsNullOrEmpty(userEntity.F_UserId) ? userEntity.F_UserId : username; logEntity.F_Module = Config.GetValue("SoftName"); #endregion if (!userEntity.LoginOk)//登录失败 { //写入日志 logEntity.F_ExecuteResult = 0; logEntity.F_ExecuteResultJson = "登录失败:" + userEntity.LoginMsg; logEntity.WriteLog(); int num = OperatorHelper.Instance.AddCurrentErrorNum(); return Fail(userEntity.LoginMsg, num); } else { var operatorInfo = OperatorHelper.Instance.AddLoginUser(userEntity.F_Account, "Learun_WebApi_6.1_PC", null);//写入缓存信息 //写入日志 logEntity.F_ExecuteResult = 1; logEntity.F_ExecuteResultJson = "登录成功"; logEntity.WriteLog(); var X= log4net.LogManager.GetLogger("INFO"); X.Info("登录成功!"); OperatorHelper.Instance.ClearCurrentErrorNum(); //成功了 就可以重置了 bool isFirstLogin = false; if (userEntity.PasswordUpdateTime == null)//没有修改密码 { isFirstLogin = true; } #region 权限相关 //用于是否可以锁定IO分配界面里的channel等 bool isIOModuleAdmin = true; //userEntity.F_CompanyId CompanyService companyService = new CompanyService(); var companyObj = companyService.GetList().FirstOrDefault(x => x.F_CompanyId == userEntity.F_CompanyId); var Department = ""; if (companyObj != null) { Department = companyObj.F_FullName; if (Department.Contains("轮机")) { Department = "轮机"; } else { Department = "电气"; } } else { Department = "电气"; } #endregion return Success("登录成功", new { operatorInfo.token, operatorInfo.loginMark, operatorInfo.account, userId = userEntity.F_UserId, RealName = userEntity.F_RealName, IsIOModuleAdmin = isIOModuleAdmin, isFirstLogin, Department = Department }); } #endregion } catch (Exception ex) { return Fail(ex.Message); } } /// /// 退出登录 /// /// [HttpPost] [HandlerApiLogin(FilterMode.Enforce)] [TokenAuthorize] public IHttpActionResult OutLogin() { try { var token = HttpContext.Current.Request.Headers["logintoken"] ?? ""; var loginkey = HttpContext.Current.Request.Headers["loginkey"] ?? ""; var userInfo = LoginUserInfo.Get(); userBll.UpdateOpenId(userInfo.userId, "");//绑定微信ID LogEntity logEntity = new LogEntity(); logEntity.F_CategoryId = 1; logEntity.F_OperateTypeId = ((int)OperationType.Exit).ToString(); logEntity.F_OperateType = EnumAttribute.GetDescription(OperationType.Exit); logEntity.F_OperateAccount = userInfo.account + "(" + userInfo.realName + ")"; logEntity.F_OperateUserId = userInfo.userId; logEntity.F_ExecuteResult = 1; logEntity.F_ExecuteResultJson = "退出系统"; logEntity.F_Module = Config.GetValue("SoftName"); logEntity.WriteLog(); OperatorHelper.Instance.EmptyCurrent(token, loginkey); return Success("退出系统"); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 是否登录验证 /// /// 登录token /// 登录标识 /// [HttpGet] public IHttpActionResult ValidateLogin(string token, string loginkey) { try { // 验证登录状态 var res = OperatorHelper.Instance.IsOnLine(token, loginkey, "", ""); var errmsg = ""; //登录验证错误 if (res == null || res.userInfo == null) { errmsg = "权限验证失败,请联系管理员"; } else if (res.stateCode == 0) { errmsg = "用户登录过期"; } else if (res.stateCode == -1) { errmsg = "用户未登录"; } if (!string.IsNullOrEmpty(errmsg)) { return Fail("验证失败", new { LoginResCode = res.stateCode, UserAccount = "", UserName = "" }); } return Success(new { LoginResCode = res.stateCode, UserAccount = res.userInfo.account, UserName = res.userInfo.realName }); } catch (Exception ex) { return Fail(ex.Message); } } } }