HttpContent не привязан к модели в API после чтения содержимого в атрибуте Authorize - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть веб-API, который принимает модель

[CustomAuthorize]
public HttpResponseMessage UpdateStatus(Model model)

В customAuthorize мне нужно прочитать содержимое запроса, чтобы подтвердить, что он не взломан

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

Когда пользовательский атрибут применяется к веб-API, модель всегда возвращается в ноль. Связывание не происходит. Я попытался использовать некоторые методы клонирования, найденные здесь, чтобы клонировать запрос и использовать его для авторизации, но, похоже, это тоже не работает. Как клонировать сообщение HttpRequestMessage, если исходный запрос имеет содержимое?

Кто-нибудь знает, как я могу сохранить HttpContent в запросе, чтобы он связывался с методом?

1 Ответ

0 голосов
/ 14 ноября 2018

Это потому, что содержимое может быть прочитано из запроса только один раз, так как запрос является потоком только для пересылки.Вы читаете его в атрибуте, а затем привязка модели пытается прочитать его снова, но не может.

Эта хакерская статья может помочь вам понять

Если честновам может быть лучше использовать заголовок 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...