0
0

AuthController.cs 5.8 KB

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