JwtHandler.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using Admin.NET.Core;
  2. using Admin.NET.Core.Service;
  3. using Furion;
  4. using Furion.Authorization;
  5. using Furion.DataEncryption;
  6. using Microsoft.AspNetCore.Authorization;
  7. using Microsoft.AspNetCore.Http;
  8. using System.Threading.Tasks;
  9. using Microsoft.Extensions.DependencyInjection;
  10. namespace Admin.NET.Web.Core
  11. {
  12. public class JwtHandler : AppAuthorizeHandler
  13. {
  14. /// <summary>
  15. /// 自动刷新Token
  16. /// </summary>
  17. /// <param name="context"></param>
  18. /// <returns></returns>
  19. public override async Task HandleAsync(AuthorizationHandlerContext context)
  20. {
  21. // 读取参数
  22. var serviceProvider = context.GetCurrentHttpContext().RequestServices;
  23. var sysConfigService = serviceProvider.GetService<SysConfigService>();
  24. var tokenExpire = await sysConfigService.GetTokenExpire();
  25. var refreshTokenExpire = await sysConfigService.GetRefreshTokenExpire();
  26. if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext(), tokenExpire, refreshTokenExpire))
  27. {
  28. await AuthorizeHandleAsync(context);
  29. }
  30. else
  31. {
  32. context.Fail(); // 授权失败
  33. DefaultHttpContext currentHttpContext = context.GetCurrentHttpContext();
  34. if (currentHttpContext == null)
  35. return;
  36. currentHttpContext.SignoutToSwagger();
  37. }
  38. }
  39. public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
  40. {
  41. // 已自动验证 Jwt Token 有效性
  42. return await CheckAuthorzieAsync(httpContext);
  43. }
  44. /// <summary>
  45. /// 权限校验核心逻辑
  46. /// </summary>
  47. /// <param name="httpContext"></param>
  48. /// <returns></returns>
  49. private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
  50. {
  51. // 登录模式判断PC、APP
  52. if (App.User.FindFirst(ClaimConst.LoginMode)?.Value == ((int)LoginModeEnum.APP).ToString())
  53. return true;
  54. // 排除超管
  55. if (App.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString())
  56. return true;
  57. // 路由/按钮名称
  58. var routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
  59. // 获取用户拥有按钮权限集合
  60. var ownBtnPermList = await App.GetService<SysMenuService>().GetOwnBtnPermList();
  61. // 获取系统所有按钮权限集合
  62. var allBtnPermList = await App.GetService<SysMenuService>().GetAllBtnPermList();
  63. // 已拥有该按钮权限或者所有按钮集合里面不存在
  64. var exist1 = ownBtnPermList.Exists(u => routeName.Contains(u, System.StringComparison.CurrentCultureIgnoreCase));
  65. var exist2 = allBtnPermList.TrueForAll(u => !routeName.Contains(u, System.StringComparison.CurrentCultureIgnoreCase));
  66. return exist1 || exist2;
  67. }
  68. }
  69. }