using System.Security.Cryptography; using System.Text; using Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; using OpenAuth.App.Interface; using OpenAuth.App.Response; using OpenAuth.App.SSO; using OpenAuth.Repository.Domain; using Infrastructure.Helpers; using SqlSugar; using Infrastructure.Extensions; using Infrastructure.Utilities; namespace OpenAuth.WebApi.Controllers { /// /// /// 登录及与登录信息获取相关的接口 /// [Route("api/[controller]/[action]")] [ApiController] //[ApiExplorerSettings(GroupName = "登录验证_Check")] public class CheckController : ControllerBase { private readonly IAuth _authUtil; private AuthStrategyContext _authStrategyContext; public CheckController(IAuth authUtil) { _authUtil = authUtil; _authStrategyContext = _authUtil.GetCurrentUser(); } #region 当前登录用户资源 #region 用户信息 /// /// 获取登录用户资料 /// /// [HttpGet] public Response GetUserProfile() { var resp = new Response(); try { resp.Result = _authStrategyContext.User.MapTo(); if (_authStrategyContext.Orgs != null) { var orgLevel = _authStrategyContext.Orgs.Min(a => a.Level); resp.Result.OrgMaxLevel = orgLevel.ToString(); } } catch (Exception e) { resp.Code = 500; resp.Message = e.Message; } return resp; } #endregion #region 角色 /// /// 获取登录用户的所有可访问的角色 /// [HttpGet] public Response> GetRoles() { var result = new Response>(); try { result.Result = _authStrategyContext.Roles; } catch (CommonException ex) { if (ex.Code == Define.INVALID_TOKEN) { result.Code = ex.Code; result.Message = ex.Message; } else { result.Code = 500; result.Message = ex.InnerException != null ? "OpenAuth.WebAPI数据库访问失败:" + ex.InnerException.Message : "OpenAuth.WebAPI数据库访问失败:" + ex.Message; } } return result; } #endregion #region 部门 /// /// 获取登录用户的所有可访问的组织信息 /// [HttpGet] public Response> GetOrgs() { var result = new Response>(); try { result.Result = _authStrategyContext.Orgs; } catch (CommonException ex) { if (ex.Code == Define.INVALID_TOKEN) { result.Code = ex.Code; result.Message = ex.Message; } else { result.Code = 500; result.Message = ex.InnerException != null ? "OpenAuth.WebAPI数据库访问失败:" + ex.InnerException.Message : "OpenAuth.WebAPI数据库访问失败:" + ex.Message; } } return result; } #endregion #region 菜单 /// /// 获取登录用户的所有可访问的模块及菜单,以列表形式返回结果 /// [HttpGet] public Response> GetModules() { var result = new Response>(); try { result.Result = _authStrategyContext.Modules; } catch (CommonException ex) { if (ex.Code == Define.INVALID_TOKEN) { result.Code = ex.Code; result.Message = ex.Message; } else { result.Code = 500; result.Message = ex.InnerException != null ? "OpenAuth.WebAPI数据库访问失败:" + ex.InnerException.Message : "OpenAuth.WebAPI数据库访问失败:" + ex.Message; } } return result; } /// /// 获取登录用户的所有可访问的模块及菜单,以树状结构返回 /// 菜单类型 /// [HttpGet] public Response>> GetModulesTree(string typeid) { var result = new Response>>(); try { result.Result = _authStrategyContext.Modules.WhereIF(!string.IsNullOrEmpty(typeid), a => a.ModuleTypeId == typeid).OrderBy(a => a.SortNo).GenerateTree(u => u.Id, u => u.ParentId, "0"); } catch (CommonException ex) { if (ex.Code == Define.INVALID_TOKEN) { result.Code = ex.Code; result.Message = ex.Message; } else { result.Code = 500; result.Message = ex.InnerException != null ? "OpenAuth.WebAPI数据库访问失败:" + ex.InnerException.Message : "OpenAuth.WebAPI数据库访问失败:" + ex.Message; } } return result; } #endregion #endregion #region 登录 /// /// 获取公钥 /// /// [HttpGet] [AllowAnonymous] public Response GetPubKey() { var resp = new Response(); try { var configuration = ConfigHelper.GetConfigRoot(); resp.Result = configuration["AppSetting:pubKey"]; } catch (Exception e) { resp.Code = 500; resp.Result = ""; resp.Message = e.Message; } return resp; } /// /// 登录接口 /// /// 登录参数 /// [HttpPost] [AllowAnonymous] public Response Login(PassportLoginRequest request) { //获取秘钥 RSACryptoServiceProvider rsa = new(); var configuration = ConfigHelper.GetConfigRoot(); var priKey = configuration["AppSetting:priKey"]; rsa.FromXmlString(priKey); var cipherbytex = rsa.Decrypt(Convert.FromBase64String(request.Password), false); var password = Encoding.UTF8.GetString(cipherbytex); return _authUtil.Login(request.AppKey, request.Account, password); } /// /// 注销登录 /// /// /// 备用参数. [HttpPost] public Response Logout() { var resp = new Response(); try { resp.Result = _authUtil.Logout(); } catch (Exception e) { resp.Result = false; resp.Message = e.Message; } return resp; } #endregion #region 未启用/后台使用 #region 检验token是否有效 /// /// 检验token是否有效 /// /// The token. /// 备用参数. [HttpGet] [ApiExplorerSettings(IgnoreApi = true)] public Response GetStatus() { var result = new Response(); try { result.Result = _authUtil.CheckLogin(); } catch (Exception ex) { result.Code = Define.INVALID_TOKEN; result.Message = ex.Message; } return result; } /// /// 图片验证token /// /// [HttpGet] public IActionResult Validate() { if (_authUtil.CheckLogin()) { return Ok(); } else { return BadRequest(); } } #endregion #region 根据token获取用户名称 /// /// 根据token获取用户名称 /// [HttpGet] [ApiExplorerSettings(IgnoreApi = true)] public Response GetUserName() { var result = new Response(); try { result.Result = _authStrategyContext.User.Account; } catch (CommonException ex) { if (ex.Code == Define.INVALID_TOKEN) { result.Code = ex.Code; result.Message = ex.Message; } else { result.Code = 500; result.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } } return result; } #endregion #region 加载机构的全部下级机构 /// /// 加载机构的全部下级机构 /// /// 机构ID /// [HttpGet] [ApiExplorerSettings(IgnoreApi = true)] public TableData GetSubOrgs(long orgId) { string cascadeId = ".0."; if (orgId != 0) { var org = _authStrategyContext.Orgs.SingleOrDefault(u => u.Id == orgId); if (org == null) { return new TableData { msg = "未找到指定的节点", code = 500, }; } cascadeId = org.CascadeId; } var query = _authStrategyContext.Orgs .Where(u => u.CascadeId.Contains(cascadeId)) .OrderBy(u => u.CascadeId); return new TableData { data = query.ToList(), count = query.Count(), }; } #endregion #endregion } }