如何在AuthorAttribute的ASP.NET Web.API MVC 5的IsAuthorized上获取Post参数

时间:2017-03-08 05:58:40

标签: c# asp.net asp.net-mvc asp.net-web-api2

我需要在授权时获取我的帖子参数的值。网络上的搜索者但没有解决方案正在运作。 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
}

有什么建议吗?

3 个答案:

答案 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();
    }
}