在Asp.net Web Api授权过滤器上,如何访问参数?

Ben*_*Ben 13 authorization asp.net-web-api

我从Asp.Net Web API开始,这是我的问题:

我实现了一个自定义授权过滤器来检查我的邮件头,寻找API密钥.基于此API密钥,我检索我的用户,然后我想看看他是否可以访问某些资源.我想要检查的资源ID是HTTP请求的参数.但是,当我使用AuthorizationFilter方法时,操作参数列表为空.

我怎样才能做到这一点 ?

如果我使用ActionFilter代替授权过滤器,我怎么能确定这将是第一个执行的过滤器?在全球范围内,如何指定过滤器的执行顺序?

最后一个问题,是否有可能在"管道"上添加一些我可以在任何过滤器上检索的数据?像会话商店但限于请求的东西?

谢谢你的回复

Mar*_*nes 24

授权属性在参数绑定运行之前运行,因此您不能(如您所见)使用该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
    }
}
Run Code Online (Sandbox Code Playgroud)

关于执行顺序:

使用FilterScope Enumeration指定过滤器执行顺序的方法有3种:范围为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__"];

    }
Run Code Online (Sandbox Code Playgroud)