首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Asp.net核心IAuthorizationFilter :返回空的顶级属性

Asp.net核心IAuthorizationFilter :返回空的顶级属性
EN

Stack Overflow用户
提问于 2022-06-10 10:47:59
回答 1查看 2.8K关注 0票数 1

我使用的是.NET核心3和AuthorizationFilter继承的IAuthorizationFilter。在我的顶层属性上,我添加了自定义属性(ModulePermission)。

我需要获得AuthorizeActionFilter -> OnAuthorization函数上的属性值。

但是,我可以访问当前动作自定义属性(ActionPermission)。但我的顶级属性为null。( var模块= actionDescriptor.MethodInfo.GetCustomAttributes(true).FirstOrDefault(i => i is ModulePermissionAttribute);)

示例

Api控制器:

代码语言:javascript
运行
复制
[ModulePermission(Module.Product)]
[Route("api/products")]
[ApiController]
public class ProductController : BaseApiController
{
     public ProductController()
     {
     }

    [Route(""), HttpPost, ActionPermission(Action.READ)]
    public Response<Product> Get()
    {
            // some code
     }
}

授权类别:

代码语言:javascript
运行
复制
    using System;
    using System.Linq;
    using System.Reflection;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Controllers;
    using Microsoft.AspNetCore.Mvc.Filters; 
  
    public enum Module
    {
        User,
        Product
    }
    
    public enum Action
    {
        Read,
        Delete,
        Add,
        Edit
    }
    
     [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
     public class ActionPermissionAttribute : Attribute
     {
        private Action _action;
        public Action action { get { return action; } }
    
        public ActionPermissionAttribute(Action action = Action.Read)
        {
           _action = action;
        }
      }
    
     [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
     public class ModulePermissionAttribute : Attribute
     {
         private string _module;
         public string Module { get { return _module; } }
         public ModulePermissionAttribute(string module = "")
         {
            if (string.IsNullOrEmpty(module))
            {
                 _module = "Novalue";
            }
            else
            {
                 _module = module;
             }
          }
         public ModulePermissionAttribute(Type module)
         {
                _module = module.Name;
            }
        }
    
    
        public class AuthorizeAttribute : TypeFilterAttribute
        {
            public AuthorizeAttribute()
            : base(typeof(AuthorizeActionFilter))
            {
            }
        }
    
        public class AuthorizeActionFilter : IAuthorizationFilter
        {
            public AuthorizeActionFilter()
            {
            }
            public void OnAuthorization(AuthorizationFilterContext context)
            {
                bool isAuthorized = //check authorized or not
                var actionDescriptor = (context.ActionDescriptor as ControllerActionDescriptor);
    
                var module = actionDescriptor.MethodInfo.GetCustomAttributes<ModulePermissionAttribute>(true).FirstOrDefault(i => i is ModulePermissionAttribute); 
               // **here module is always null**

                var method = actionDescriptor.MethodInfo.GetCustomAttributes<ActionPermissionAttribute>(false).FirstOrDefault(i => i is ActionPermissionAttribute);
    
                // check module and method exists for the user
    
                if (!isAuthorized)
                {
                    context.Result = new ForbidResult();
                }
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-13 10:23:28

使用EndpointMetadata找到答案

代码语言:javascript
运行
复制
var module = context.ActionDescriptor.EndpointMetadata.OfType<ModulePermissionAttribute>().FirstOrDefault();

希望这能帮到别人

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72573052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档