AuthController.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using System;
  2. using System.Linq;
  3. using System.Diagnostics;
  4. using System.Threading.Tasks;
  5. using System.Security.Claims;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.AspNetCore.Authorization;
  8. using Microsoft.AspNetCore.Mvc.ModelBinding;
  9. using Admin.Core.Attributes;
  10. using Admin.Core.Common.Auth;
  11. using Admin.Core.Common.Output;
  12. using Admin.Core.Service.Admin.Auth;
  13. using Admin.Core.Service.Admin.Auth.Input;
  14. using Admin.Core.Service.Admin.Auth.Output;
  15. using Admin.Core.Service.Admin.LoginLog;
  16. using Admin.Core.Service.Admin.LoginLog.Input;
  17. using Admin.Core.Common.Helpers;
  18. using Admin.Core.Service.Admin.User;
  19. namespace Admin.Core.Controllers.Admin
  20. {
  21. /// <summary>
  22. /// 授权管理
  23. /// </summary>
  24. public class AuthController : AreaController
  25. {
  26. private readonly IUserToken _userToken;
  27. private readonly IAuthService _authService;
  28. private readonly IUserService _userServices;
  29. private readonly ILoginLogService _loginLogService;
  30. public AuthController(
  31. IUserToken userToken,
  32. IAuthService authServices,
  33. IUserService userServices,
  34. ILoginLogService loginLogService
  35. )
  36. {
  37. _userToken = userToken;
  38. _authService = authServices;
  39. _userServices = userServices;
  40. _loginLogService = loginLogService;
  41. }
  42. /// <summary>
  43. /// 获得token
  44. /// </summary>
  45. /// <param name="output"></param>
  46. /// <returns></returns>
  47. private IResponseOutput GetToken(ResponseOutput<AuthLoginOutput> output)
  48. {
  49. if (!output.Success)
  50. {
  51. return ResponseOutput.NotOk(output.Msg);
  52. }
  53. var user = output.Data;
  54. var token = _userToken.Create(new[]
  55. {
  56. new Claim(ClaimAttributes.UserId, user.Id.ToString()),
  57. new Claim(ClaimAttributes.UserName, user.UserName),
  58. new Claim(ClaimAttributes.UserNickName, user.NickName)
  59. });
  60. return ResponseOutput.Ok(new { token });
  61. }
  62. /// <summary>
  63. /// 获取验证码
  64. /// </summary>
  65. /// <param name="lastKey">上次验证码键</param>
  66. /// <returns></returns>
  67. [HttpGet]
  68. [AllowAnonymous]
  69. [NoOprationLog]
  70. public async Task<IResponseOutput> GetVerifyCode(string lastKey)
  71. {
  72. return await _authService.GetVerifyCodeAsync(lastKey);
  73. }
  74. /// <summary>
  75. /// 获取密钥
  76. /// </summary>
  77. /// <returns></returns>
  78. [HttpGet]
  79. [AllowAnonymous]
  80. [NoOprationLog]
  81. public async Task<IResponseOutput> GetPassWordEncryptKey()
  82. {
  83. return await _authService.GetPassWordEncryptKeyAsync();
  84. }
  85. /// <summary>
  86. /// 查询用户信息
  87. /// </summary>
  88. /// <returns></returns>
  89. [HttpGet]
  90. [Login]
  91. public async Task<IResponseOutput> GetUserInfo()
  92. {
  93. return await _authService.GetUserInfoAsync();
  94. }
  95. /// <summary>
  96. /// 用户登录
  97. /// 根据登录信息生成Token
  98. /// </summary>
  99. /// <param name="input">登录信息</param>
  100. /// <returns></returns>
  101. [HttpPost]
  102. [AllowAnonymous]
  103. [NoOprationLog]
  104. public async Task<IResponseOutput> Login(AuthLoginInput input)
  105. {
  106. var sw = new Stopwatch();
  107. sw.Start();
  108. var res = await _authService.LoginAsync(input);
  109. sw.Stop();
  110. #region 添加登录日志
  111. var loginLogAddInput = new LoginLogAddInput()
  112. {
  113. CreatedUserName = input.UserName,
  114. ElapsedMilliseconds = sw.ElapsedMilliseconds,
  115. Status = res.Success,
  116. Msg = res.Msg
  117. };
  118. ResponseOutput<AuthLoginOutput> output = null;
  119. if (res.Success)
  120. {
  121. output = (res as ResponseOutput<AuthLoginOutput>);
  122. var user = output.Data;
  123. loginLogAddInput.CreatedUserId = user.Id;
  124. loginLogAddInput.NickName = user.NickName;
  125. }
  126. await _loginLogService.AddAsync(loginLogAddInput);
  127. #endregion
  128. if (!res.Success)
  129. {
  130. return res;
  131. }
  132. return GetToken(output);
  133. }
  134. /// <summary>
  135. /// 刷新Token
  136. /// 以旧换新
  137. /// </summary>
  138. /// <param name="token"></param>
  139. /// <returns></returns>
  140. [HttpGet]
  141. [AllowAnonymous]
  142. public async Task<IResponseOutput> Refresh([BindRequired] string token)
  143. {
  144. var userClaims = _userToken.Decode(token);
  145. if(userClaims == null || userClaims.Length == 0)
  146. {
  147. return ResponseOutput.NotOk();
  148. }
  149. var refreshExpiresValue = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value;
  150. if (refreshExpiresValue.IsNull())
  151. {
  152. return ResponseOutput.NotOk();
  153. }
  154. var refreshExpires = refreshExpiresValue.ToDate();
  155. if(refreshExpires <= DateTime.Now)
  156. {
  157. return ResponseOutput.NotOk("登录信息已过期");
  158. }
  159. var userId = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.UserId)?.Value;
  160. if (userId.IsNull())
  161. {
  162. return ResponseOutput.NotOk();
  163. }
  164. var output = await _userServices.GetLoginUserAsync(userId.ToLong());
  165. return GetToken(output);
  166. }
  167. }
  168. }