.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
相关产品推荐
相关产品推荐

