在Authorize属性中读取内容后,HttpContent未绑定到api中的模型



我有一个web api,它接受了一个模型

[CustomAuthorize]
public HttpResponseMessage UpdateStatus(Model model)

在customAuthorize中,我必须阅读请求的内容,以验证它没有被黑客入侵

class CustomAuthorizeAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext context) 
{
var content = context.Request.Content.ReadAsFormDataAsync().Result;
}
}

当我将CustomAttribute应用于web api时,模型总是返回null。绑定没有发生。我尝试过使用这里的一些克隆方法来克隆请求并将其用于授权,但这似乎也不起作用。当原始请求具有Content时,如何克隆HttpRequestMessage?

有人知道我如何在请求中保留HttpContent以使其绑定到方法吗?

这是因为请求是仅向前流,因此只能从请求中读取一次内容。您正在属性中读取它,然后模型绑定尝试再次读取它,但无法读取。

这篇被黑客攻击的文章可能会帮助你理解

老实说,你最好使用Authorization标头来放入哈希,毕竟这就是它的用途。我过去使用HMAC做过这件事(查看本文(。读取属性中的Authorization标头可以这样完成:

class CustomAuthorizeAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext context)
{
var authhash = context.Request.Headers.Authorization.Parameter;
}
}

同样仅供参考,您应该使用OnAuthorization方法的异步版本,而不是在异步调用的末尾添加.Result,因此您的原始代码看起来像:

class CustomAuthorizeAttribute : AuthorizationFilterAttribute
{
public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
var content = await actionContext.Request.Content.ReadAsFormDataAsync(cancellationToken);
}
}

最新更新