是否可以通过HttpActionContext对象访问post或get参数?
我有一组传感器可以将数据记录到提供REST API的Web服务器上 . 我想通过让传感器在数据中包含其硬件ID然后在数据库中查找以查看id是否存在来介绍某种身份验证/授权 . 由于API提供了许多web api操作方法,我最好使用自定义授权属性
public class ApiAuthorizationFilter : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
return false;
}
}
如何从actionContext访问post / get数据?
编辑:POST的示例
POST /Api/api/ActionMethod/ HTTP/1.1\r\n
Content-Type: application/json\r\n
Host: localhost\r\n
Accept: */*\r\n
Content-Length:52\r\n
\r\n
{"Id": '121a222bc', "Time": '2012-02-02 12:00:00'}\r\n
祝你今天愉快!
5 回答
由于其性质,AuthoriseAttribute看起来像在模型 Binders 和参数绑定运行之前在管道中调用 . 当您访问Request.Content并从中读取时也遇到问题...这只能是done once如果您要在auth属性中尝试它,您可能会破坏mediaTypeFormater ...
Update 有不同的方法来指定执行上下文... http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx . AuthoriseAttribute是"Global",因此访问操作信息的时间过早 .
如果您想要访问模型和参数,您可以稍微改变您的方法并使用OnActionExecuting过滤器(“Action”过滤器范围),并根据您的验证抛出401或403 .
此过滤器稍后在执行过程中调用,因此您可以完全访问绑定数据 .
非常简单的例子如下:
示例控制器:
其他答案说的是......他们是对的,如果你可以访问URL上的所有内容,可以通过请求获取内容;但是,我认为模型和请求内容应该保持不变:
我在调用
/api/client/123/users
之类的东西时访问了上下文路由数据以从自定义AuthorizeAttribute中获取参数:您可以使用以下代码从自定义授权属性访问查询字符串值:
虽然这个问题已经得到解答 . 但是如果其他人需要它,你可以从ActionFilterAttribute获取查询字符串,如下所示:
但通常我如何构建API授权是通过向用户/客户端等向数据库添加密钥(唯一字符串)来使用标头和自定义验证逻辑 .
您应该能够从
actionContext.Request
获取此信息,这是获取请求数据的方法 .发布的数据在
actionContext.Request.Content
或者如果是GET请求,您可以从actionContext.Request.RequestUri
获取查询字符串