ValidatePermissionAttribute.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.AspNetCore.Mvc.Filters;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using System;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using ZhonTai.Admin.Core.Auth;
  9. namespace ZhonTai.Admin.Core.Attributes;
  10. /// <summary>
  11. /// 启用权限验证
  12. /// </summary>
  13. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
  14. public class ValidatePermissionAttribute : AuthorizeAttribute, IAuthorizationFilter, IAsyncAuthorizationFilter
  15. {
  16. private async Task PermissionAuthorization(AuthorizationFilterContext context)
  17. {
  18. //排除匿名访问
  19. if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(AllowAnonymousAttribute)))
  20. return;
  21. //登录验证
  22. var user = context.HttpContext.RequestServices.GetService<IUser>();
  23. if (user == null || !(user?.Id > 0))
  24. {
  25. context.Result = new ChallengeResult();
  26. return;
  27. }
  28. //排除登录接口
  29. if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(LoginAttribute)))
  30. return;
  31. //权限验证
  32. var httpMethod = context.HttpContext.Request.Method;
  33. var api = context.ActionDescriptor.AttributeRouteInfo.Template;
  34. var permissionHandler = context.HttpContext.RequestServices.GetService<IPermissionHandler>();
  35. var isValid = await permissionHandler.ValidateAsync(api, httpMethod);
  36. if (!isValid)
  37. {
  38. context.Result = new ForbidResult();
  39. }
  40. }
  41. public async void OnAuthorization(AuthorizationFilterContext context)
  42. {
  43. await PermissionAuthorization(context);
  44. }
  45. public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
  46. {
  47. await PermissionAuthorization(context);
  48. }
  49. }