Доступ к 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, и я не хочу обсуждать эту тему здесь.