AuthController.cs 6.1 KB

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