0

如果我对一个操作有多个授权属性,我的理解是,System.Web.Mvc.AuthorizeAttribute我可以指定如下Order属性:

[CustomAuth(Order=2)]
[CustomAuth(Order=1)]
public ActionResult Get() { }

但这在 Web API 的授权属性中不存在。如何订购 Web API 中属性的执行?

此外,类级别的属性是否总是优先于装饰动作的属性?

4

1 回答 1

2

我可以回答你的一个问题。

此外,类级别的属性是否总是优先于装饰动作的属性?

ApiController.ExecuteAsync() 运行从 HttpActionDescriptor.GetFilterPipeline() 获得的过滤器列表。这是为 GetFilterPipeline() 给出的注释。

///Returns the filters for the given configuration and action. The filter
///collection is ordered according to the FilterScope (in order from
///least specific to most specific: First, Global, Controller, Action)

因此,全局过滤器首先运行,然后是控制器级别,然后是操作级别过滤器。

至于您关于如何订购的其他问题,我没有明确的答案。我了解过滤器(属性)是使用 Type.GetCustomAttributes() 检索的。此方法不保证任何顺序,但通常以相反的顺序返回。例如,如果您有这样的操作方法,

[CustomAuth(Name="1")]
[CustomAuth(Name="2")]
public HttpResponseMessage Get()
{
}

Name="2" 的过滤器在列表中排在第一位,然后是 typeof(YourApiController).GetCustomAttributes() 返回的列表中的“1”。如果我是你,我不会对这个订单做任何假设。我宁愿在操作方法级别有一个授权过滤器,并按照我想要的顺序运行逻辑。

无论如何,如果您添加两个全局 authz 过滤器,例如

config.Filters.Add(new CustomAuth() { Name = "g1" });
config.Filters.Add(new CustomAuth() { Name = "g2" });

并有一个控制器

[CustomAuth(Name="c1")]
[CustomAuth(Name="c2")]
public class ValuesController : ApiController
{
    [CustomAuth(Name="1")]
    [CustomAuth(Name="2")]
    public HttpResponseMessage Get()
    {
    }
}

过滤器按以下顺序运行:g1、g2、c2、c1、2 和 1。

于 2013-06-12T04:19:49.477 回答