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

ASP.NET Web API中如何配置带属性的Action Filter?

ASP.NET Web API 带参数的权限过滤器实现方案

核心修正步骤

问题出在RequiredPermissionAttribute的Arguments赋值以及参数传递匹配上,以下是完整可运行的实现:


1. 完善权限过滤器类

public class PermissionRequirementFilter : IAuthorizationFilter
{
    readonly string[] _permissions;

    public PermissionRequirementFilter(string[] permissions)
    {
        _permissions = permissions;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var claims = context.HttpContext.User.Claims;
        var service = context.HttpContext.RequestServices.GetService<IntegrationContext>() 
                      ?? throw new InvalidOperationException("IntegrationContext 未注册");
        
        var roleClaim = claims.FirstOrDefault(c => c.Type == "extension_Role");

        // 权限验证逻辑示例
        if (roleClaim == null)
        {
            context.Result = new UnauthorizedResult();
            return;
        }

        // 根据业务逻辑从服务获取角色对应权限集合
        var rolePermissions = service.Roles.FirstOrDefault(r => r.Name == roleClaim.Value)?.Permissions;
        if (rolePermissions == null || !_permissions.All(p => rolePermissions.Contains(p)))
        {
            context.Result = new ForbidResult();
        }
    }
}

2. 修正权限属性类

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = false)]
public class RequiredPermissionAttribute : TypeFilterAttribute
{
    // 使用params参数简化调用
    public RequiredPermissionAttribute(params string[] permissions) : base(typeof(PermissionRequirementFilter))
    {
        // 将权限数组传递给过滤器构造函数
        Arguments = new object[] { permissions };
    }
}

3. 控制器中的使用(两种写法均支持)

[ApiController]
[Route("[controller]")]
[EnableCors("AllowAll")]
public class AbcController : ControllerBase
{
    [HttpGet]
    // 写法1:简化版(推荐)
    [RequiredPermission("permission_1", "permission_2")]
    // 写法2:原始数组写法
    // [RequiredPermission(new[] { "permission_1", "permission_2" })]
    [Authorize]
    public async Task<ActionResult> Get()
    {
        return Ok("test");
    }
}

关键注意事项

  • TypeFilterAttribute的作用:它会自动动态实例化指定的过滤器类型,不需要在Program.cs/Startup.cs中全局注册过滤器,只需标记属性即可生效。
  • 参数匹配:Arguments必须是object[],数组元素的顺序和类型要与过滤器构造函数的参数完全匹配,否则过滤器无法被实例化,逻辑不会执行。
  • 权限拦截逻辑:验证不通过时必须给context.Result赋值(如UnauthorizedResult/ForbidResult),否则请求会继续执行后续流程,达不到拦截效果。
  • params参数优化:使用params string[]可以让属性调用更简洁,避免每次手动创建数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:54