在定制授权MVC4 Web Api中访问post或get参数

可以通过HttpActionContext对象访问post或者获取参数吗?

我有一组传感器将数据logging到提供REST API的Web服务器。 我想通过让传感器在数据中包含硬件ID来引入某种authentication/授权,然后在数据库中查找是否存在该ID。 由于API提供了许多Web API操作方法,我最好喜欢使用自定义授权属性

public class ApiAuthorizationFilter : AuthorizeAttribute { protected override bool IsAuthorized(HttpActionContext actionContext) { return false; } } 

我怎样才能从actionContext访问/获取数据?

编辑: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 

祝你今天愉快!

由于其性质,AuthoriseAttribute看起来像是在模型绑定器和参数绑定运行之前在stream水线中调用的。 当您访问Request.Content并从中读取时,您也遇到问题…只能执行一次 ,如果您要在auth属性中尝试它,则可能会中断mediaTypeFormater …

在WebAPI中,请求主体(一个HttpContent)可以是只读的,无限的,非缓冲的,不可回滚的stream。

更新有不同的方式来指定执行上下文… http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx 。 AuthoriseAttribute是“全局”的,因此访问操作信息太早了。

假设你想访问模型和参数,你可以稍微改变你的方法,而是使用OnActionExecutingfilter(“Action”filter作用域),并根据你的validation抛出401或403。

此filter稍后在执行过程中被调用,因此您可以完全访问绑定的数据。

下面这个很简单的例子

 public class ApiAuthorizationFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { Foo model = (Foo)actionContext.ActionArguments["model"]; string param1 = (string)actionContext.ActionArguments["param1"]; int param2 = (int)actionContext.ActionArguments["param2"]; if (model.Id != "1") throw new HttpResponseException(System.Net.HttpStatusCode.Forbidden); base.OnActionExecuting(actionContext); } } 

示例控制器:

 public class Foo { public string Id { get; set; } public DateTime Time { get; set; } } public class FoosController : ApiController { // PUT api/foos/5 [ApiAuthorizationFilter] public Foo Put(int id, Foo model, [FromUri]string param1 = null, int? param2 = null) { return model; } } 

其他答案是什么意思….他们是正确的,你可以,如果你可以访问所有你需要的URL,通过请求获取东西; 然而,我认为模型和请求内容应该被单独留下:

 var queryStringCollection = HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query); //example for param1 string param1 = queryStringCollection["param1"]; //example for param2 int param2 = int.Parse(queryStringCollection["param2"]); //Example of getting the ID from the URL var id = actionContext.Request.RequestUri.Segments.LastOrDefault(); 

我访问了上下文路由数据,以便在调用类似/api/client/123/users时从自定义的AuthorizeAttribute中获取参数:

 public class CustomAuthorizeAttribute : AuthorizeAttribute { protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) { var clientId = Convert.ToInt32(actionContext.ControllerContext.RouteData.Values["clientid"]); // Check if user can access the client account. } } 

您可以通过使用以下代码从您的自定义授权属性访问查询string值:

 public class ApiAuthorizationFilter : AuthorizeAttribute { protected override void OnAuthorization(AuthorizationContext filterContext) { var querystring = filterContext.RequestContext.HttpContext.Request.QueryString; // Do what you need } } 

虽然这个问题已经被回答了。 但如果有人需要它,你可以从中得到querystrings

 HttpActionContext actionContext 

如下:

 var queryParameters = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value); var some_value = queryParameters.ContainsKey("some_key") ? queryParameters["some_key"] : string.Empty; 

你应该能够从actionContext.Request获取这个信息。这是获取请求数据的方式。

发布的数据是在actionContext.Request.Content或者,如果它是一个GET请求,你可以从actionContext.Request.RequestUri查询string