JwtHandler.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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.Collections.Generic;
  9. using System.Threading.Tasks;
  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. if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext(),
  22. App.GetOptions<JWTSettingsOptions>().ExpiredTime,
  23. App.GetOptions<RefreshTokenOptions>().ExpiredTime))
  24. {
  25. await AuthorizeHandleAsync(context);
  26. }
  27. else
  28. {
  29. context.Fail(); // 授权失败
  30. DefaultHttpContext currentHttpContext = context.GetCurrentHttpContext();
  31. if (currentHttpContext == null)
  32. return;
  33. currentHttpContext.SignoutToSwagger();
  34. }
  35. }
  36. public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
  37. {
  38. // 已自动验证 Jwt Token 有效性
  39. return await CheckAuthorzieAsync(httpContext);
  40. }
  41. /// <summary>
  42. /// 检查权限
  43. /// </summary>
  44. /// <param name="httpContext"></param>
  45. /// <returns></returns>
  46. private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
  47. {
  48. // 管理员跳过判断
  49. if (App.User.FindFirst(ClaimConst.SuperAdmin)?.Value == ((int)UserTypeEnum.SuperAdmin).ToString()) return true;
  50. // 路由名称
  51. var routeName = "";
  52. if (httpContext.Request.Path.StartsWithSegments("/api"))
  53. {
  54. routeName = httpContext.Request.Path.Value[5..].Replace("/", ":");
  55. }
  56. else
  57. {
  58. routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
  59. }
  60. // 默认路由(获取登录用户信息)
  61. var defalutRoute = new List<string>()
  62. {
  63. "getLoginUser", //登录
  64. "sysMenu:change" //切换顶部菜单
  65. };
  66. if (defalutRoute.Contains(routeName)) return true;
  67. // 获取用户权限集合(按钮或API接口)
  68. var permissionList = await App.GetService<SysMenuService>().GetPermCodeList();
  69. var allPermissionList = await App.GetService<SysMenuService>().GetAllPermCodeList();
  70. // 检查授权
  71. // 菜单中没有配置按钮权限,则不限制
  72. return permissionList.Exists(p => p.Equals(routeName, System.StringComparison.CurrentCultureIgnoreCase))
  73. || allPermissionList.TrueForAll(p => !p.Equals(routeName, System.StringComparison.CurrentCultureIgnoreCase));
  74. }
  75. }
  76. }