AuthController.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. 
  2. using OASystem.Infrastructure.Repositories.Login;
  3. using System.IdentityModel.Tokens.Jwt;
  4. using System.Security.Claims;
  5. using OASystem.Domain.Dtos.UserDto;
  6. using OASystem.API.OAMethodLib;
  7. using Serilog.Parsing;
  8. using OASystem.Domain.Dtos.System;
  9. using System.Drawing.Drawing2D;
  10. namespace OASystem.API.Controllers
  11. {
  12. /// <summary>
  13. /// 鉴权相关
  14. /// </summary>
  15. [Route("api/")]
  16. public class AuthController : ControllerBase
  17. {
  18. private readonly IMapper _mapper;
  19. private readonly IConfiguration _config;
  20. private readonly LoginRepository _loginRep;
  21. private readonly MessageRepository _message;
  22. public AuthController(IConfiguration config, LoginRepository loginRep, IMapper mapper,MessageRepository message)
  23. {
  24. _config = config;
  25. _loginRep = loginRep;
  26. _mapper = mapper;
  27. _message = message;
  28. }
  29. /// <summary>
  30. /// 用户登录
  31. /// </summary>
  32. /// <param name="dto"></param>
  33. /// <returns></returns>
  34. [Route("login")]
  35. [HttpPost]
  36. [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
  37. public async Task<IActionResult> LoginAsync(LoginDto dto)
  38. {
  39. #region 校验用户信息
  40. var userData = _loginRep.Login(dto).Result;
  41. if (userData.Code != 0)
  42. {
  43. if (userData.Code != 0) { return Ok(JsonView(false, userData.Msg)); }
  44. return Ok(JsonView(false, "暂无该员工信息!"));
  45. }
  46. #endregion
  47. dynamic authData = null;
  48. var view = new LoginView
  49. {
  50. UserInfo = userData.Data,
  51. AuthData = authData,
  52. };
  53. DateTime createZebraTime = DateTime.Now;
  54. string authorId = dto.Number + "Token";
  55. string authorToken = await RedisRepository.RedisFactory.CreateRedisRepository().StringGetAsync<string>(authorId);//string 取
  56. if (authorToken != null)
  57. {
  58. #region 解析出过期时间
  59. var jwtHandler = new JwtSecurityTokenHandler();
  60. JwtSecurityToken securityToken = jwtHandler.ReadJwtToken(authorToken);
  61. DateTime expDt = (securityToken.Payload[JwtRegisteredClaimNames.Exp] ?? 0).GetInt().GetTimeSpmpToDate();
  62. #endregion
  63. if (expDt >= createZebraTime) //超时重新获取token
  64. {
  65. authorToken = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
  66. }
  67. view.Expires = expDt;
  68. view.Token = authorToken;
  69. }
  70. else
  71. {
  72. view.Expires = createZebraTime.AddMinutes(30);
  73. view.Token = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
  74. TimeSpan ts = view.Expires.AddMinutes(-1) - createZebraTime; //设置redis 过期时间 比 jwt 时间 快一分钟
  75. await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>(authorId, view.Token, ts);//string 存
  76. }
  77. #region 测试添加系统消息
  78. //await _message.AddMsg(new MessageDto()
  79. //{
  80. // Type = 1,
  81. // IssuerId = 208,
  82. // Title = "测试添加消息标题",
  83. // Content = "消息体测试",
  84. // ReleaseTime = DateTime.Now,
  85. // UIdList = new List<int> {
  86. // 5,
  87. // 208,
  88. // 219
  89. // }
  90. //});
  91. #endregion
  92. return Ok(JsonView(view));
  93. }
  94. /// <summary>
  95. /// 申请注册
  96. /// </summary>
  97. /// <param name="dto"></param>
  98. /// <returns></returns>
  99. [Authorize]
  100. [HttpPost]
  101. [Route("register")]
  102. public async Task<IActionResult> Register(RegisterDto dto)
  103. {
  104. var userData = _loginRep.Register(_loginRep, dto);
  105. if (userData.Result.Code != 0)
  106. {
  107. if (userData.Result.Code != 0) { return Ok(JsonView(false, userData.Result.Msg)); }
  108. return Ok(JsonView(false, "注册失败!"));
  109. }
  110. return Ok(new { Code = 0, Msg = userData.Result.Msg });
  111. }
  112. /// <summary>
  113. /// 修改密码
  114. /// </summary>
  115. /// <param name="dto"></param>
  116. /// <returns></returns>
  117. [Authorize]
  118. [HttpPost]
  119. [Route("UpdPassword")]
  120. public async Task<IActionResult> UpdateUserPassword(UpdateDto dto)
  121. {
  122. Result result = new Result();
  123. Sys_Users sys_Users = _mapper.Map<Sys_Users>(dto);
  124. var _UpdateState = await _loginRep.UpdateAsync(s => s.Id == dto.UserId, ss => sys_Users);
  125. if (_UpdateState)
  126. {
  127. result.Code = 0;
  128. result.Msg = "申请成功!人事主管审核后且信息部经理分配了登录账号,可登录OA!";
  129. }
  130. else
  131. {
  132. result.Code = -2;
  133. result.Msg = "用户修改失败!";
  134. }
  135. return Ok(JsonView(result));
  136. }
  137. /// <summary>
  138. /// 测试auth
  139. /// </summary>
  140. /// <param name="dto"></param>
  141. /// <returns></returns>
  142. [OASystemAuthentication]
  143. [HttpPost("TestToken")]
  144. [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
  145. public async Task<IActionResult> TestToken(LoginDto dto)
  146. {
  147. string authorId = dto.Number + "Token";
  148. // 从Redis里面取数据
  149. //string userToken = _redis.StringGet(authorId);
  150. string userToken = "";
  151. var view = new LoginView
  152. {
  153. Token = authorId + ":" + userToken
  154. };
  155. return Ok(JsonView(view));
  156. }
  157. }
  158. }