我需要在授权时获取我的帖子参数的值。网络上的搜索者但没有解决方案正在运作。 ActionArguments
计数始终显示为0且无法在ActionDescriptor.GetParameters()
这是我的代码:
POST模型 -
public class XyzModel
{
public int Prop1 { get; set; }
public string Prop2 { get; set; }
}
自定义授权属性 -
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
bool conditions = // here I need to check value of my model (XyzModel) properties
if(conditions)
{
return true;
}
return false;
}
}
控制器中的代码 -
[HttpPost]
[CustomAuthorizeAttribute]
public IHttpActionResult MyAction(XyzModel model)
{
// my work here
}
有什么建议吗?
答案 0 :(得分:4)
您可以访问ActionArguments的模型属性,它将返回XyzModel对象。你可以对它的属性执行任何操作:
XyzModel model = (XyzModel)actionContext.ActionArguments["model"];
在您的代码中,它将是这样的:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var prop1 = HttpContext.Current.Request.Params["Prop1"];
var prop2 = HttpContext.Current.Request.Params["Prop2"];
bool conditions = // add conditions based on above properties
if(conditions)
{
return true;
}
return false;
}
}
答案 1 :(得分:3)
我相信,在动作的参数绑定之前调用AuthorizeAttribute
方法时,您不会在AuthorizeAttribute
中获得post参数值。
对于您的方案,您可以使用仅在操作参数绑定后执行的ActionFilterAttribute
。您可以使用ActionFilterAttribute
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
public class CheckMyPostDataFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
XyzModel model = (XyzModel )actionContext.ActionArguments["model"]; // you will get data here
base.OnActionExecuting(actionContext);
}
}
您可以在操作中简单地在CheckMyPostDataFilter
过滤器上方进行装饰:
[HttpPost]
[CheckMyPostData]
public IHttpActionResult MyAction(XyzModel model)
{
// my work here
}
答案 2 :(得分:2)
您可以使用Request Body Input Stream来读取整个Body内容,如下所示
public sealed class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var req = HttpContext.Current.Request.InputStream;
string body = new StreamReader(req).ReadToEnd();
}
}