ValidatePermissionAttribute.cs 2.0 KB

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