如何获取属性中的控制器端点信息?

How do I get the controller endpoint information in an attribute?

我有一个 ASP.NET Web API,其中包含大量控制器和操作。通过使用 EndpointDataSource,我可以获得 API 中所有端点的列表,它在启动期间用于维护控制器和操作 table。我将 link 这些记录到一个角色 table 这样我就可以在不更改代码的情况下管理特定操作和控制器的角色。这将允许管理员创建自定义角色来提供对这些控制器和操作的访问。 API 已经有一个自定义身份验证机制,其中用户被分配到各种角色,所以我不能使用“标准”解决方案进行角色管理。 (登录过程有点复杂。)
所以我想创建一个 class 属性 [ClassRole] 和一个方法属性 [ActionRole] 来附加到任何需要通过角色管理的操作。所以我有这段代码: [AttributeUsage(AttributeTargets.Class)]

public class ControllerRoleAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
    }
}
[AttributeUsage(AttributeTargets.Method)]
public class ActionRoleAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
    }
}

并且这些方法需要做一些事情。基本上,在数据库中查找控制器名称或操作名称很容易。但是如何从这个 AuthorizationFilterContext class 中获取控制器名称和操作名称?最好不必解析 URL 或其他任何内容。
仅供参考:ActionRoleAttribute 将首先通过控制器验证角色,然后再通过操作进行验证。
在这两种情况下,当验证失败时,将引发自定义异常并记录其他数据。这也是为什么我需要一个单独的解决方案。此外,如果当前用户具有 AdminSuperAdmin 状态,则不会检查角色,但会自动授予访问权限。
这个 API 有很多控制器,每个控制器只有几个动作。每个控制器都是一个处理相关动作的逻辑单元。这些操作中的大多数都涉及数据管理,并且往往是敏感信息。这有点复杂,因为用户管理本身也有点复杂,因为用户被分为组和子组,并且可以将角色分配给特定用户、组或子组。管理员只控制他们自己的组和子组,而超级管理员就是我。我应该可以做任何事情。
最重要的是获取控制器名称!

AuthorizationFilterContext class has a property called ActionDescriptor that holds the detail you require. However, it uses a derived class that is specific to controllers, so you need to cast it to a ControllerActionDescriptor 获取相关详细信息。所以你可以这样做:

public void OnAuthorization(AuthorizationFilterContext context)
{
    if (context.ActionDescriptor is 
            ControllerActionDescriptor controllerActionDescriptor)
    {
        var actionName = controllerActionDescriptor.ActionName;
        var controllerName = controllerActionDescriptor.ControllerName;
    }
}