授权属性在参数绑定运行之前运行,因此您不能(如您所见)使用该ActionArguments
集合。相反,您需要将请求 uri 用于查询参数,并将路由数据用于 uri 参数,如下所示。
//request at http://localhost/api/foo/id?MyValue=1
public class MyAuthorizationAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
//will not work as parameter binding has not yet run
object value;
actionContext.ActionArguments.TryGetValue("id", out value);
//Will get you the resource id assuming a default route like /api/foo/{id}
var routeData = actionContext.Request.GetRouteData();
var myId = routeData.Values["id"] as string;
//uri is still accessible so use this to get query params
var queryString = HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query);
var myQueryParam = queryString["MyValue"];
//and so on
}
}
关于执行顺序:
有 3 种不同的方法可以使用FilterScope 枚举指定过滤器的执行顺序...范围是 Global、Controller 和 Action。是“全球性的AuthoriseAttribute
”,因此它
在 Controller 之前指定一个动作。
如果您需要在这 3 个范围内指定执行顺序,那么您应该在此处阅读这篇博客文章,您需要在其中实现一个FilterProvider
向管道添加一些数据:
对请求使用属性集合,此集合在请求期间可用。
protected override bool IsAuthorized(HttpActionContext actionContext)
{
actionContext.Request.Properties.Add("__MYKEY__","MyValue");
//access this later in the controller or other action filters using
var value = actionContext.Request.Properties["__MYKEY__"];
}