AuthService.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 系统登录授权服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Name = "登录授权", Order = 200)]
  6. public class AuthService : IDynamicApiController, ITransient
  7. {
  8. private readonly SqlSugarRepository<SysUser> _sysUserRep;
  9. private readonly RefreshTokenOptions _refreshTokenOptions;
  10. private readonly IHttpContextAccessor _httpContextAccessor;
  11. private readonly IUserManager _userManager;
  12. private readonly IEventPublisher _eventPublisher;
  13. private readonly SysUserService _sysUserService;
  14. private readonly SysUserRoleService _sysUserRoleService;
  15. public AuthService(SqlSugarRepository<SysUser> sysUserRep,
  16. IOptions<RefreshTokenOptions> refreshTokenOptions,
  17. IHttpContextAccessor httpContextAccessor,
  18. IUserManager userManager,
  19. IEventPublisher eventPublisher,
  20. SysUserService sysUserService,
  21. SysUserRoleService sysUserRoleService)
  22. {
  23. _sysUserRep = sysUserRep;
  24. _httpContextAccessor = httpContextAccessor;
  25. _userManager = userManager;
  26. _refreshTokenOptions = refreshTokenOptions.Value;
  27. _eventPublisher = eventPublisher;
  28. _sysUserService = sysUserService;
  29. _sysUserRoleService = sysUserRoleService;
  30. }
  31. /// <summary>
  32. /// 登录系统
  33. /// </summary>
  34. /// <param name="input"></param>
  35. /// <remarks>用户名/密码:admin/123456</remarks>
  36. /// <returns></returns>
  37. [HttpPost("/login")]
  38. [AllowAnonymous]
  39. public async Task<LoginOutput> Login([Required] LoginInput input)
  40. {
  41. var encryptPasswod = MD5Encryption.Encrypt(input.Password); // 加密密码
  42. // 判断用户名密码
  43. var user = await _sysUserRep.AsQueryable().Includes(u => u.SysOrg)
  44. .FirstAsync(u => u.UserName.Equals(input.UserName) && u.Password.Equals(encryptPasswod));
  45. _ = user ?? throw Oops.Oh(ErrorCodeEnum.D1000);
  46. // 验证账号是否被冻结
  47. if (user.Status == StatusEnum.Disable)
  48. throw Oops.Oh(ErrorCodeEnum.D1017);
  49. // 生成Token令牌
  50. var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
  51. {
  52. {ClaimConst.UserId, user.Id},
  53. {ClaimConst.TenantId, user.TenantId},
  54. {ClaimConst.UserName, user.UserName},
  55. {ClaimConst.RealName, user.RealName},
  56. {ClaimConst.SuperAdmin, user.UserType},
  57. {ClaimConst.OrgId, user.OrgId},
  58. {ClaimConst.OrgName, user.SysOrg?.Name},
  59. });
  60. // 设置Swagger自动登录
  61. _httpContextAccessor.HttpContext.SigninToSwagger(accessToken);
  62. // 生成刷新Token令牌
  63. var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, _refreshTokenOptions.ExpiredTime);
  64. // 设置刷新Token令牌
  65. _httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = refreshToken;
  66. return new LoginOutput
  67. {
  68. UserId = user.Id,
  69. Token = accessToken
  70. };
  71. }
  72. /// <summary>
  73. /// 获取用户信息
  74. /// </summary>
  75. /// <returns></returns>
  76. [HttpGet("/getUserInfo")]
  77. public async Task<LoginUserInfoOutput> GetUserInfo()
  78. {
  79. var user = _userManager.User;
  80. if (user == null)
  81. throw Oops.Oh(ErrorCodeEnum.D1011);
  82. // 角色信息
  83. var roles = await _sysUserRoleService.GetUserRoleList(user.Id);
  84. // 数据范围
  85. var dataScopes = await _sysUserService.GetUserOrgIdList();
  86. // 增加登录日志
  87. var client = Parser.GetDefault().Parse(_httpContextAccessor.HttpContext.Request.Headers["User-Agent"]);
  88. await _eventPublisher.PublishAsync(new ChannelEventSource("Add:VisLog",
  89. new SysLogVis
  90. {
  91. Success = YesNoEnum.Y,
  92. Message = "登录",
  93. Ip = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(),
  94. Browser = client.UA.Family + client.UA.Major,
  95. Os = client.OS.Family + client.OS.Major,
  96. VisType = LoginTypeEnum.Login,
  97. UserName = user.UserName,
  98. RealName = user.RealName
  99. }));
  100. return new LoginUserInfoOutput
  101. {
  102. UserId = user.Id,
  103. Username = user.UserName,
  104. RealName = user.RealName,
  105. Avatar = user.Avatar,
  106. Desc = user.Introduction,
  107. Roles = roles.Select(u => new LoginRole
  108. {
  109. RoleName = u.Name,
  110. Value = u.Code
  111. }).ToList(),
  112. };
  113. }
  114. /// <summary>
  115. /// 获取刷新Token
  116. /// </summary>
  117. /// <param name="accessToken"></param>
  118. /// <returns></returns>
  119. [HttpPost("/getRefreshToken")]
  120. public string RefreshToken([Required] string accessToken)
  121. {
  122. return JWTEncryption.GenerateRefreshToken(accessToken, _refreshTokenOptions.ExpiredTime);
  123. }
  124. /// <summary>
  125. /// 退出系统
  126. /// </summary>
  127. [HttpGet("/logout")]
  128. public async void Logout()
  129. {
  130. var user = _userManager.User;
  131. if (user == null)
  132. throw Oops.Oh(ErrorCodeEnum.D1011);
  133. // 退出Swagger
  134. _httpContextAccessor.HttpContext.SignoutToSwagger();
  135. //_httpContextAccessor.HttpContext.Response.Headers["access-token"] = "invalid token";
  136. // 增加退出日志
  137. await _eventPublisher.PublishAsync(new ChannelEventSource("Add:VisLog",
  138. new SysLogVis
  139. {
  140. Success = YesNoEnum.Y,
  141. Message = "退出",
  142. VisType = LoginTypeEnum.Logout,
  143. Ip = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(),
  144. UserName = user.UserName,
  145. RealName = user.RealName
  146. }));
  147. }
  148. }