如果我对某个操作有多个授权属性,我的理解是对于System.Web.Mvc.AuthorizeAttribute
我可以指定Order
属性,如:
[CustomAuth(Order=2)]
[CustomAuth(Order=1)]
public ActionResult Get() { }
但是,这在Web API的authorize属性中不存在。如何在Web API中命令执行属性?
此外,类级别的属性是否始终优先于装饰操作的属性?
答案 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.