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)
归档时间: |
|
查看次数: |
12165 次 |
最近记录: |