Подтвердить что ты не робот

Доступ к сообщению или получение параметров в пользовательской авторизации MVC4 Web Api

Можно ли получить доступ к сообщению или получить параметры через объект HttpActionContext?

У меня есть набор датчиков, которые регистрируют данные на веб-сервере, который предоставляет REST api. Я хотел бы ввести некоторую аутентификацию/авторизацию, позволяя датчикам включать их идентификатор оборудования в данные, а затем выполнить поиск в базе данных, чтобы узнать, существует ли идентификатор. Поскольку API предоставляет множество методов действия api для веб-приложений, я бы идеально хотел использовать специальный атрибут авторизации

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

Как я могу получить доступ к сообщению/получить данные из actionContext?

EDIT: Пример 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

Приятного дня!

4b9b3361

Ответ 1

В силу своей природы AuthoriseAttribute выглядит так, как будто он вызывается в конвейере до того, как запущены привязки модели и привязки параметров. Вы также сталкиваетесь с проблемами при доступе к Request.Content и чтении из него... это может быть только сделано один раз, и если вы собираетесь попробовать его в своем auth атрибут, вы можете сломать mediaTypeFormater...

в WebAPI, тело запроса (HttpContent) может быть потоком без ограничений, только для чтения, без буферизации.

Обновление Существуют разные способы указания контекста выполнения... http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx. Авторизованный атрибут "Глобальный", поэтому ему слишком рано обращаться к информации о действиях.

Учитывая, что вы хотите получить доступ к модели и параметрам, вы можете слегка изменить свой подход и использовать фильтр OnActionExecuting (область действия "Действие" ) и выбросить 401 или 403 на основе вашей проверки.

Этот фильтр вызывается позже в процессе выполнения, и поэтому у вас есть полный доступ к связанным данным.

Очень простой пример ниже:

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();

Ответ 2

Я обратился к данным контекстного маршрута, чтобы получить параметры из пользовательского атрибута AuthorizeAttribute, когда вы вызываете что-то вроде /api/client/123/users:

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.

     }
  }

Ответ 3

Вы можете получить значения строки запроса из своего настраиваемого атрибута авторизации, используя следующий код:

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

Ответ 4

Хотя на этот вопрос уже был дан ответ. Но если кому-то это понадобится, вы можете получить запросы от

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;

Ответ 5

Вы можете получить эту информацию от actionContext.Request Это способ получить данные запроса.

Опубликованные данные находятся в actionContext.Request.Content Или, если это запрос GET, вы можете получить запрос от actionContext.Request.RequestUri