Доступ к QueryString в пользовательском атрибуте AuthorizeAttribute

Я использую Web API и настроил простой механизм аутентификации и авторизации, когда вызывающий абонент передает выданный мне токен в строке запроса. Таким образом, они отправляют запрос как:

https://mysite.com/api/Ping?token=[issued-token]

У меня есть ApiAuthorizeAttribute, как это:

public class ApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    public ApiPermission Permission { get; set; }

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        switch (Permission)
        {
            case ApiPermission.None: 
               return;

           case ApiPermission.Write:
           case ApiPermission.Read:

               string query = actionContext.Request.RequestUri.Query;
               var nvc = System.Web.HttpUtility.ParseQueryString(query);
               string token = nvc["token"];

               // (my code to map the token to an Authorization for the request)               
               ApiAuthorization auth = ApiToken.GetAuthorization(token);
               if (auth != null && auth.HasPermission(Permission))
                   return;

               HandleUnauthorizedRequest(actionContext);
               return;

           default:
               throw new ArgumentException("Unexpected Permission");
        }
    }
}

Тогда я могу украсить свои API, как это. Примечание: это всего лишь пример, реальный вызов считывает данные из своей учетной записи (идентификатор учетной записи зашифрован в их токене) и возвращает их.

/// 
/// Ping service that requires a Token with Read permission
/// Returns "Success!"
/// 
[ApiAuthorize(Permission = ApiPermission.Read)]
[HttpGet]
public string Ping()
{
    return "Success!";
}

Как вы могли заметить, я не мог получить доступ к QueryString где-либо из параметра HttpActionContext, и мне пришлось самому его собрать. Похоже, что они явно удалили QueryString из этого объекта запроса. Я нене хочу добавлять «лексема» это для каждого метода API, чтобы получить его в данных маршрута.

Итак, мои вопросы:

Где-то есть QueryString, и я просто скучаю по нему? Если нет, любая идея, почему Microsoft невключить его в этот объект запроса? (то есть, может быть, это плохая вещь?)Есть ли лучший способ получить токен в AuthorizeAttribute (опять же, без добавления его к каждому вызову)?

Кстати, я понимаю, что есть другие (возможно, лучшие) варианты авторизации, такие как Basic Authentication и OAuth, и я не хочу обсуждать эту тему здесь.

Ответы на вопрос(2)

Ваш ответ на вопрос