System.Web.Http.AuthorizeAttribute中的Order属性

时间:2013-06-11 16:23:18

标签: asp.net-mvc rest asp.net-web-api

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

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

但是,这在Web API的authorize属性中不存在。如何在Web API中命令执行属性?

此外,类级别的属性是否始终优先于装饰操作的属性?

1 个答案:

答案 0 :(得分: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)

因此,首先运行gloabl过滤器,然后是控制器级别,然后是动作级过滤器。

至于你关于如何订购的另一个问题,我虽然没有明确的答案。我理解使用Type.GetCustomAttributes()检索过滤器(属性)。此方法不保证任何订单,但通常以相反的顺序返回。例如,如果你有这样的动作方法,

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

名称=“2”的过滤器首先出现在列表中,然后是typeof(YourApiController)返回的列表中的“1”.GetCustomAttributes()。如果我是你,我不会对这个订单做任何假设。我更倾向于在操作方法级别使用一个Authorization过滤器,并按照我想要的顺序运行逻辑。

无论如何,如果你添加两个全局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.