AuthService.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using System.Security.Claims;
  5. using Admin.Core.Model.Admin;
  6. using Admin.Core.Model.Output;
  7. using Admin.Core.Repository.Admin;
  8. using Admin.Core.Common.Helpers;
  9. using Admin.Core.Common.Auth;
  10. using Admin.Core.Common.Cache;
  11. using Admin.Core.Service.Admin.Auth.Input;
  12. using AutoMapper;
  13. using Admin.Core.Service.Admin.Auth.Output;
  14. namespace Admin.Core.Service.Admin.Auth
  15. {
  16. public class AuthService : IAuthService
  17. {
  18. private readonly IUser _user;
  19. private readonly ICache _cache;
  20. private readonly IMapper _mapper;
  21. private readonly IUserToken _userToken;
  22. private readonly IUserRepository _userRepository;
  23. private readonly IRolePermissionRepository _rolePermissionRepository;
  24. public AuthService(
  25. IUser user,
  26. ICache cache,
  27. IMapper mapper,
  28. IUserToken userToken,
  29. IUserRepository userRepository,
  30. IRolePermissionRepository rolePermissionRepository
  31. )
  32. {
  33. _user = user;
  34. _cache = cache;
  35. _mapper = mapper;
  36. _userToken = userToken;
  37. _userRepository = userRepository;
  38. _rolePermissionRepository = rolePermissionRepository;
  39. }
  40. public async Task<IResponseOutput> LoginAsync(AuthLoginInput input)
  41. {
  42. #region 验证码校验
  43. var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey);
  44. var exists = await _cache.ExistsAsync(verifyCodeKey);
  45. if (exists)
  46. {
  47. var verifyCode = await _cache.GetAsync(verifyCodeKey);
  48. if (string.IsNullOrEmpty(verifyCode))
  49. {
  50. return ResponseOutput.NotOk("验证码已过期!",1);
  51. }
  52. if (verifyCode.ToLower() != input.VerifyCode.ToLower())
  53. {
  54. return ResponseOutput.NotOk("验证码输入有误!",2);
  55. }
  56. await _cache.DelAsync(verifyCodeKey);
  57. }
  58. else
  59. {
  60. return ResponseOutput.NotOk("验证码已过期!", 1);
  61. }
  62. #endregion
  63. var user = (await _userRepository.GetAsync(a => a.UserName == input.UserName));
  64. if (!(user?.Id > 0))
  65. {
  66. return ResponseOutput.NotOk("账号输入有误!", 3);
  67. }
  68. #region 解密
  69. if (input.PasswordKey.NotNull())
  70. {
  71. var passwordEncryptKey = string.Format(CacheKey.PassWordEncryptKey, input.PasswordKey);
  72. var existsPasswordKey = await _cache.ExistsAsync(passwordEncryptKey);
  73. if (existsPasswordKey)
  74. {
  75. var secretKey = await _cache.GetAsync(passwordEncryptKey);
  76. if (passwordEncryptKey.IsNull())
  77. {
  78. return ResponseOutput.NotOk("解密失败!",1);
  79. }
  80. input.Password = DesEncrypt.Decrypt(input.Password, secretKey);
  81. await _cache.DelAsync(passwordEncryptKey);
  82. }
  83. else
  84. {
  85. return ResponseOutput.NotOk("解密失败!",1);
  86. }
  87. }
  88. #endregion
  89. var password = MD5Encrypt.Encrypt32(input.Password);
  90. if (user.Password != password)
  91. {
  92. return ResponseOutput.NotOk("密码输入有误!",4);
  93. }
  94. var authLoginOutput = _mapper.Map<AuthLoginOutput>(user);
  95. return ResponseOutput.Ok(authLoginOutput);
  96. }
  97. public async Task<IResponseOutput> GetUserInfoAsync()
  98. {
  99. if (!(_user?.Id > 0))
  100. {
  101. return ResponseOutput.NotOk("未登录!");
  102. }
  103. var user = await _userRepository.Select.WhereDynamic(_user.Id)
  104. .ToOneAsync(m=>new {
  105. m.NickName,
  106. m.Name,
  107. m.Avatar
  108. });
  109. //获取菜单
  110. var menus = await _rolePermissionRepository.Select
  111. .InnerJoin<UserRoleEntity>((a, b) => a.RoleId == b.RoleId && b.UserId == _user.Id)
  112. .Include(a => a.Permission.View)
  113. .Where(a => new[] { PermissionType.Group,PermissionType.Menu }.Contains(a.Permission.Type))
  114. .OrderBy(a => a.Permission.ParentId)
  115. .OrderBy(a => a.Permission.Sort)
  116. .Distinct()
  117. .ToListAsync(a => new
  118. {
  119. a.Permission.Id,
  120. a.Permission.ParentId,
  121. a.Permission.Path,
  122. ViewPath = a.Permission.View.Path,
  123. a.Permission.Label,
  124. a.Permission.Icon,
  125. a.Permission.Opened,
  126. a.Permission.Closable,
  127. a.Permission.Hidden,
  128. a.Permission.NewWindow,
  129. a.Permission.External
  130. });
  131. return ResponseOutput.Ok(new { user, menus });
  132. }
  133. public async Task<IResponseOutput> GetVerifyCodeAsync(string lastKey)
  134. {
  135. var img = VerifyCodeHelper.GetBase64String(out string code);
  136. //删除上次缓存的验证码
  137. if (lastKey.NotNull())
  138. {
  139. await _cache.DelAsync(lastKey);
  140. }
  141. //写入Redis
  142. var guid = Guid.NewGuid().ToString("N");
  143. var key = string.Format(CacheKey.VerifyCodeKey, guid);
  144. await _cache.SetAsync(key, code, TimeSpan.FromMinutes(5));
  145. var data = new { key = guid, img };
  146. return ResponseOutput.Ok(data);
  147. }
  148. public async Task<IResponseOutput> GetPassWordEncryptKeyAsync()
  149. {
  150. //写入Redis
  151. var guid = Guid.NewGuid().ToString("N");
  152. var key = string.Format(CacheKey.PassWordEncryptKey, guid);
  153. var encyptKey = StringHelper.GenerateRandom(8);
  154. await _cache.SetAsync(key, encyptKey, TimeSpan.FromMinutes(5));
  155. var data = new { key = guid, encyptKey };
  156. return ResponseOutput.Ok(data);
  157. }
  158. }
  159. }