AuthController.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. new Claim(ClaimAttributes.TenantId, user.TenantId.ToString())
  61. });
  62. return ResponseOutput.Ok(new { token });
  63. }
  64. /// <summary>
  65. /// 获取验证码
  66. /// </summary>
  67. /// <param name="lastKey">上次验证码键</param>
  68. /// <returns></returns>
  69. [HttpGet]
  70. [AllowAnonymous]
  71. [NoOprationLog]
  72. public async Task<IResponseOutput> GetVerifyCode(string lastKey)
  73. {
  74. return await _authService.GetVerifyCodeAsync(lastKey);
  75. }
  76. /// <summary>
  77. /// 获取密钥
  78. /// </summary>
  79. /// <returns></returns>
  80. [HttpGet]
  81. [AllowAnonymous]
  82. [NoOprationLog]
  83. public async Task<IResponseOutput> GetPassWordEncryptKey()
  84. {
  85. return await _authService.GetPassWordEncryptKeyAsync();
  86. }
  87. /// <summary>
  88. /// 查询用户信息
  89. /// </summary>
  90. /// <returns></returns>
  91. [HttpGet]
  92. [Login]
  93. public async Task<IResponseOutput> GetUserInfo()
  94. {
  95. return await _authService.GetUserInfoAsync();
  96. }
  97. /// <summary>
  98. /// 用户登录
  99. /// 根据登录信息生成Token
  100. /// </summary>
  101. /// <param name="input">登录信息</param>
  102. /// <returns></returns>
  103. [HttpPost]
  104. [AllowAnonymous]
  105. [NoOprationLog]
  106. public async Task<IResponseOutput> Login(AuthLoginInput input)
  107. {
  108. var sw = new Stopwatch();
  109. sw.Start();
  110. var res = await _authService.LoginAsync(input);
  111. sw.Stop();
  112. #region 添加登录日志
  113. var loginLogAddInput = new LoginLogAddInput()
  114. {
  115. CreatedUserName = input.UserName,
  116. ElapsedMilliseconds = sw.ElapsedMilliseconds,
  117. Status = res.Success,
  118. Msg = res.Msg
  119. };
  120. ResponseOutput<AuthLoginOutput> output = null;
  121. if (res.Success)
  122. {
  123. output = (res as ResponseOutput<AuthLoginOutput>);
  124. var user = output.Data;
  125. loginLogAddInput.CreatedUserId = user.Id;
  126. loginLogAddInput.NickName = user.NickName;
  127. }
  128. await _loginLogService.AddAsync(loginLogAddInput);
  129. #endregion
  130. if (!res.Success)
  131. {
  132. return res;
  133. }
  134. return GetToken(output);
  135. }
  136. /// <summary>
  137. /// 刷新Token
  138. /// 以旧换新
  139. /// </summary>
  140. /// <param name="token"></param>
  141. /// <returns></returns>
  142. [HttpGet]
  143. [AllowAnonymous]
  144. public async Task<IResponseOutput> Refresh([BindRequired] string token)
  145. {
  146. var userClaims = _userToken.Decode(token);
  147. if(userClaims == null || userClaims.Length == 0)
  148. {
  149. return ResponseOutput.NotOk();
  150. }
  151. var refreshExpires = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value;
  152. if (refreshExpires.IsNull())
  153. {
  154. return ResponseOutput.NotOk();
  155. }
  156. if(refreshExpires.ToLong() <= DateTime.Now.ToTimestamp())
  157. {
  158. return ResponseOutput.NotOk("登录信息已过期");
  159. }
  160. var userId = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.UserId)?.Value;
  161. if (userId.IsNull())
  162. {
  163. return ResponseOutput.NotOk();
  164. }
  165. var output = await _userServices.GetLoginUserAsync(userId.ToLong());
  166. return GetToken(output);
  167. }
  168. }
  169. }