AuthController.cs 5.6 KB

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