AuthController.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. 
  2. using Microsoft.Extensions.Caching.Distributed;
  3. using OASystem.Infrastructure.Repositories.Login;
  4. using System.IdentityModel.Tokens.Jwt;
  5. using System.Security.Claims;
  6. using StackExchange.Redis;
  7. using OASystem.Domain.Dtos.UserDto;
  8. using OASystem.RedisRepository;
  9. using OASystem.RedisRepository.RedisAsyncHelper;
  10. using Google.Protobuf.WellKnownTypes;
  11. namespace OASystem.API.Controllers
  12. {
  13. /// <summary>
  14. /// 鉴权相关
  15. /// </summary>
  16. [Route("api/")]
  17. public class AuthController : ControllerBase
  18. {
  19. private readonly IMapper _mapper;
  20. private readonly IConfiguration _config;
  21. private readonly LoginRepository _loginRep;
  22. //private IDatabase _redis;
  23. //private RedisHelper _redisHelper;
  24. public AuthController(IConfiguration config, LoginRepository loginRep, IMapper mapper)
  25. {
  26. _config = config;
  27. _loginRep = loginRep;
  28. _mapper = mapper;
  29. }
  30. /// <summary>
  31. /// 用户登录
  32. /// </summary>
  33. /// <param name="dto"></param>
  34. /// <returns></returns>
  35. [Route("login")]
  36. [HttpPost]
  37. [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
  38. public async Task<IActionResult> LoginAsync(LoginDto dto)
  39. {
  40. #region 校验用户信息
  41. var userData = _loginRep.Login(dto);
  42. if (userData.Result.Code != 0)
  43. {
  44. return Ok(JsonView(false, userData.Result.Msg));
  45. }
  46. #endregion
  47. string userToken = dto.Number + "Token";
  48. string userTokenString = await RedisRepository.RedisFactory.CreateRedisRepository().StringGetAsync<string>(userToken);//string 取
  49. if (userTokenString != null)
  50. {
  51. var lifeTime = new JwtSecurityTokenHandler().ReadToken(userTokenString).ValidTo;
  52. var redisView = new LoginView
  53. {
  54. //Expires = createTokenDt.AddMinutes(30),
  55. UserInfo = userData.Result.Data,
  56. Token = userTokenString
  57. };
  58. return Ok(JsonView(redisView));
  59. }
  60. DateTime createTokenDt = DateTime.Now;
  61. var view = new LoginView
  62. {
  63. Expires = createTokenDt.AddMinutes(30),
  64. UserInfo = userData.Result.Data
  65. };
  66. var claims = new[] { new Claim(ClaimTypes.NameIdentifier, "Future") };
  67. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSecurityKey"]));
  68. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  69. var token = new JwtSecurityToken(
  70. issuer: "OASystem.com",
  71. audience: "OASystem.com",
  72. claims: claims,
  73. expires: view.Expires,
  74. signingCredentials: creds);
  75. view.Token = new JwtSecurityTokenHandler().WriteToken(token);
  76. TimeSpan ExpiresTimeSpan = view.Expires - createTokenDt;
  77. //Redis String使用示例
  78. TimeSpan ts = new TimeSpan(0, 30, 0);
  79. await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>(userToken, view.Token, ExpiresTimeSpan);//string 存
  80. return Ok(JsonView(view));
  81. }
  82. /// <summary>
  83. /// 申请注册
  84. /// </summary>
  85. /// <param name="dto"></param>
  86. /// <returns></returns>
  87. [Authorize]
  88. [HttpPost]
  89. [Route("register")]
  90. public async Task<IActionResult> Register(RegisterDto dto)
  91. {
  92. var userData = _loginRep.Register(_loginRep, dto);
  93. if (userData.Result.Code != 0)
  94. {
  95. if (userData.Result.Code != 0) { return Ok(JsonView(false, userData.Result.Msg)); }
  96. return Ok(JsonView(false, "注册失败!"));
  97. }
  98. return Ok(new { Code = 0, Msg = userData.Result.Msg });
  99. }
  100. /// <summary>
  101. /// 修改密码
  102. /// </summary>
  103. /// <param name="dto"></param>
  104. /// <returns></returns>
  105. [Authorize]
  106. [HttpPost]
  107. [Route("UpdPassword")]
  108. public async Task<IActionResult> UpdateUserPassword(UpdateDto dto)
  109. {
  110. Result result = new Result();
  111. Sys_Users sys_Users = _mapper.Map<Sys_Users>(dto);
  112. var _UpdateState = await _loginRep.UpdateAsync(s => s.Id == dto.UserId, ss => sys_Users);
  113. if (_UpdateState)
  114. {
  115. result.Code = 0;
  116. result.Msg = "申请成功!人事主管审核后且信息部经理分配了登录账号,可登录OA!";
  117. }
  118. else
  119. {
  120. result.Code = -2;
  121. result.Msg = "用户修改失败!";
  122. }
  123. return Ok(JsonView(result));
  124. }
  125. /// <summary>
  126. /// 测试auth
  127. /// </summary>
  128. /// <param name="dto"></param>
  129. /// <returns></returns>
  130. [Authorize]
  131. [HttpPost("TestToken")]
  132. [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
  133. public async Task<IActionResult> TestToken(LoginDto dto)
  134. {
  135. string authorId = dto.Number + "Token";
  136. // 从Redis里面取数据
  137. //string userToken = _redis.StringGet(authorId);
  138. string userToken = "";
  139. var view = new LoginView
  140. {
  141. Token = authorId + ":" + userToken
  142. };
  143. return Ok(JsonView(view));
  144. }
  145. }
  146. }