AuthController.cs 6.0 KB

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