Files
HTCloud/HT.Cloud.Web/Controllers/LoginController.cs
2024-11-14 09:01:55 +08:00

234 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*******************************************************************************
* Copyright © 2020 HT.Cloud.Framework 版权所有
* Author: HT.Cloud
* Description: WaterCloud快速开发平台
* Website
*********************************************************************************/
using Jaina;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Linq;
using System.Threading.Tasks;
using HT.Cloud.Code;
using HT.Cloud.Domain.SystemOrganize;
using HT.Cloud.Domain.SystemSecurity;
using HT.Cloud.Service.Event;
using HT.Cloud.Service.SystemOrganize;
using HT.Cloud.Service.SystemSecurity;
namespace HT.Cloud.Web.Controllers
{
public class LoginController : Controller
{
public UserService _userService { get; set; }
public LogService _logService { get; set; }
public SystemSetService _setService { get; set; }
public RoleAuthorizeService _roleAuthServuce { get; set; }
public ISqlSugarClient _context { get; set; }
[HttpGet]
public virtual async Task<ActionResult> Index()
{
//登录页获取logo和项目名称
try
{
var systemset = await _setService.GetFormByHost("");
if (GlobalContext.SystemConfig.Demo)
{
ViewBag.UserName = systemset.F_AdminAccount;
ViewBag.Password = systemset.F_AdminPassword;
}
ViewBag.SqlMode = GlobalContext.SystemConfig.SqlMode;
ViewBag.ProjectName = systemset.F_ProjectName;
ViewBag.LogoIcon = ".." + systemset.F_Logo;
return View();
}
catch (Exception)
{
ViewBag.ProjectName = "恒拓信息系统";
ViewBag.LogoIcon = "../icon/hengtuo.ico";
return View();
}
}
[HttpGet]
[HandlerAjaxOnly]
public async Task<ActionResult> GetListJsonByLogin(string keyword)
{
var data = await _setService.GetList(keyword);
data = data.OrderBy(a => a.F_DbNumber).ToList();
foreach (var item in data)
{
item.F_AdminAccount = null;
item.F_AdminPassword = null;
item.F_DBProvider = null;
item.F_DbString = null;
item.F_PrincipalMan = null;
item.F_MobilePhone = null;
item.F_CompanyName = null;
item.F_LogoCode = null;
}
return Content(data.ToJson());
}
/// <summary>
/// 验证码获取(此接口已弃用)
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult GetAuthCode()
{
return File(new VerifyCodeHelper().GetVerifyCode(), @"image/Gif");
}
[HttpGet]
public async Task<ActionResult> OutLogin()
{
var logEntity = new LogEntity
{
F_ModuleName = "系统登录",
F_Type = DbLogType.Exit.ToString(),
F_Account = _setService.currentuser.UserCode,
F_NickName = _setService.currentuser.UserName,
F_Result = true,
F_Description = "安全退出系统",
};
await GlobalContext.GetService<IEventPublisher>().PublishAsync(new BaseEventSource("Log:create", logEntity, _userService.currentuser));
await OperatorProvider.Provider.EmptyCurrent("pc_");
return Content(new AlwaysResult { state = ResultType.success.ToString() }.ToJson());
}
/// <summary>
/// 验证登录状态请求接口
/// </summary>
/// <returns></returns>
[HttpPost]
[HandlerAjaxOnly]
[IgnoreAntiforgeryToken]
public async Task<ActionResult> CheckLoginState()
{
try
{
if (_setService.currentuser.UserId == null)
{
return Content(new AlwaysResult { state = ResultType.error.ToString() }.ToJson());
}
//登录检测
if ((await OperatorProvider.Provider.IsOnLine("pc_")).stateCode <= 0)
{
await OperatorProvider.Provider.EmptyCurrent("pc_");
return Content(new AlwaysResult { state = ResultType.error.ToString() }.ToJson());
}
else
{
//验证回退路由是否有权限,没有就删除
await CheckReturnUrl(_setService.currentuser.UserId);
return Content(new AlwaysResult { state = ResultType.success.ToString() }.ToJson());
}
}
catch (Exception)
{
return Content(new AlwaysResult { state = ResultType.error.ToString() }.ToJson());
}
}
/// <summary>
/// 登录验证
/// </summary>
/// <param name="username">用户</param>
/// <param name="password">密码</param>
/// <param name="localurl">域名</param>
/// <returns></returns>
[HttpPost]
[HandlerAjaxOnly]
[IgnoreAntiforgeryToken]
public async Task<ActionResult> CheckLogin(string username, string password, string localurl)
{
//根据域名判断租户
LogEntity logEntity = new LogEntity();
logEntity.F_ModuleName = "系统登录";
logEntity.F_Type = DbLogType.Login.ToString();
if (GlobalContext.SystemConfig.SqlMode == Define.SQL_MORE)
{
localurl = "";
}
try
{
UserEntity userEntity = await _userService.CheckLogin(username, password, localurl);
OperatorModel operatorModel = new OperatorModel();
operatorModel.UserId = userEntity.F_Id;
operatorModel.UserCode = userEntity.F_Account;
operatorModel.UserName = userEntity.F_RealName;
operatorModel.CompanyId = userEntity.F_CompanyId;
operatorModel.OrganizeId = userEntity.F_OrganizeId;
operatorModel.RoleId = userEntity.F_RoleId;
operatorModel.LoginIPAddress = WebHelper.Ip;
if (GlobalContext.SystemConfig.LocalLAN != false)
{
operatorModel.LoginIPAddressName = "本地局域网";
}
else
{
operatorModel.LoginIPAddressName = WebHelper.GetIpLocation(operatorModel.LoginIPAddress);
}
operatorModel.LoginTime = DateTime.Now;
operatorModel.DdUserId = userEntity.F_DingTalkUserId;
operatorModel.WxOpenId = userEntity.F_WxOpenId;
//各租户的管理员也是当前数据库的全部权限
operatorModel.IsSuperAdmin = userEntity.F_IsAdmin.Value;
operatorModel.IsAdmin = userEntity.F_IsAdmin.Value;
operatorModel.IsBoss = userEntity.F_IsBoss.Value;
operatorModel.IsSenior = userEntity.F_IsSenior.Value;
SystemSetEntity setEntity = await _setService.GetForm(userEntity.F_CompanyId);
operatorModel.DbNumber = setEntity.F_DbNumber;
if (operatorModel.IsAdmin && operatorModel.DbNumber == GlobalContext.SystemConfig.MainDbNumber)
{
operatorModel.IsSuperAdmin = true;
}
else
{
operatorModel.IsSuperAdmin = false;
}
//缓存保存用户信息
await OperatorProvider.Provider.AddLoginUser(operatorModel, "", "pc_");
//防重复token
string token = Utils.GuId();
HttpContext.Response.Cookies.Append("pc_" + GlobalContext.SystemConfig.TokenName, token);
await CacheHelper.SetAsync("pc_" + GlobalContext.SystemConfig.TokenName + "_" + operatorModel.UserId + "_" + operatorModel.LoginTime, token, GlobalContext.SystemConfig.LoginExpire, true);
logEntity.F_Account = userEntity.F_Account;
logEntity.F_NickName = userEntity.F_RealName;
logEntity.F_Result = true;
logEntity.F_Description = "登录成功";
await GlobalContext.GetService<IEventPublisher>().PublishAsync(new BaseEventSource("Log:create", logEntity, operatorModel));
//验证回退路由是否有权限,没有就删除
await CheckReturnUrl(operatorModel.UserId);
return Content(new AlwaysResult { state = ResultType.success.ToString(), message = "登录成功。" }.ToJson());
}
catch (Exception ex)
{
logEntity.F_Account = username;
logEntity.F_NickName = username;
logEntity.F_Result = false;
logEntity.F_Description = "登录失败," + ex.Message;
await GlobalContext.GetService<IEventPublisher>().PublishAsync(new BaseEventSource("Log:create", logEntity));
return Content(new AlwaysResult { state = ResultType.error.ToString(), message = ex.Message }.ToJson());
}
}
private async Task CheckReturnUrl(string userId)
{
var realurl = WebHelper.GetCookie("wc_realreturnurl");
var url = WebHelper.GetCookie("wc_returnurl");
if (!string.IsNullOrEmpty(realurl) && !await _roleAuthServuce.CheckReturnUrl(userId, realurl))
{
WebHelper.RemoveCookie("wc_realreturnurl");
}
if (!string.IsNullOrEmpty(url) && !await _roleAuthServuce.CheckReturnUrl(userId, url))
{
WebHelper.RemoveCookie("wc_returnurl");
}
}
}
}