You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6/8:如何在IAuthorizationFilter的OnAuthorization中检测控制器特性

在.NET 6/8中判断控制器是否标记自定义特性的方法

你可以通过AuthorizationFilterContext的ActionDescriptor属性获取当前请求对应的控制器信息,进而检查是否标记了MyMarkerAttribute。以下是两种实用的实现方式:

方法一:通过控制器类型批量检查特性

public void OnAuthorization(AuthorizationFilterContext context)
{
    // 先确认当前动作描述符属于控制器类型
    if (context.ActionDescriptor is ControllerActionDescriptor controllerActionDesc)
    {
        // 获取控制器的Type对象
        var controllerType = controllerActionDesc.ControllerTypeInfo.AsType();
        
        // 检查控制器是否标记了目标特性(支持检查父类继承的特性)
        bool hasMarkerAttribute = controllerType.GetCustomAttributes(typeof(MyMarkerAttribute), inherit: true).Any();
        
        if (hasMarkerAttribute)
        {
            // 控制器已标记特性,执行你的授权逻辑
            // 示例:从配置读取授权参数
            var authRule = configuration["AuthSettings:MyMarkerRule"];
            // ...后续校验逻辑
        }
    }
}

方法二:直接获取特性实例(更简洁)

public void OnAuthorization(AuthorizationFilterContext context)
{
    if (context.ActionDescriptor is ControllerActionDescriptor controllerActionDesc)
    {
        // 直接获取控制器上的特性实例
        var markerAttribute = controllerActionDesc.ControllerTypeInfo.GetCustomAttribute<MyMarkerAttribute>(inherit: true);
        
        if (markerAttribute != null)
        {
            // 特性存在,执行授权逻辑
            // ...
        }
    }
}

补充说明

  • 如果你的MyMarkerAttribute还可能标记在Action方法上,需要同时检查Action层面的特性,可以添加controllerActionDesc.MethodInfo.GetCustomAttribute<MyMarkerAttribute>()判断。
  • inherit: true参数会检查控制器父类是否继承了该特性,若不需要检查父类,可设为false提升性能。

内容的提问来源于stack exchange,提问作者Petr Felzmann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:22:33