AuthController.cs 5.8 KB

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