Я читаю несколько ресурсов (книги и SO-ответы) об авторизации в WebApi.
Предположим, я хочу добавить настраиваемый атрибут, который разрешает доступ только определенным пользователям:
Случай 1
Я видел такой подход переопределения OnAuthorization
, который устанавливает реакцию, если что-то не так.
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ( /*check if user OK or not*/)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}
}
Дело # 2
Но я также видел этот аналогичный пример, который также переопределяет, OnAuthorization
но с вызовом base
:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
// If not authorized at all, don't bother
if (actionContext.Response == null)
{
//...
}
}
Затем вы проверяете, установлен ли
HttpActionContext.Response
он или нет. Если он не установлен, это означает, что запрос авторизован и пользователь в порядке.
Дело # 3
Но я также видел такой подход к переопределению IsAuthorized
:
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext context)
{
if ( /*check if user OK or not*/)
{
return true;// or false
}
}
}
Дело # 4
А потом я увидел похожий пример, но с вызовом base.IsAuthorized (context):
protected override bool IsAuthorized(HttpActionContext context)
{
if (something1 && something2 && base.IsAuthorized(context)) //??
return true;
return false;
}
Еще кое-что
И наконец Доминик сказал здесь :
Вы не должны переопределять OnAuthorization - потому что вам будет не хватать обработки [AllowAnonymous].
Вопросы
1) Какие методы использовать:
IsAuthorized
илиOnAuthorization
? (или когда использовать какой)2) когда мне звонить в
base.IsAuthorized or
base.OnAuthorization`?3) Так они это построили? что если ответ нулевой, то все в порядке? (случай №2)
NB
Обратите внимание, я использую (и хочу использовать) только то, AuthorizeAttribute
что уже унаследовано от AuthorizationFilterAttribute
Зачем ?
Потому что я нахожусь на первом этапе: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
В любом случае я спрашиваю через расширение атрибута Authorize.
источник
Ответы:
Вы будете расширены,
AuthorizationFilterAttribute
если ваша логика авторизации не зависит от установленной личности и ролей. Для авторизации, связанной с пользователем, вы будете расширять и использоватьAuthorizeAttribute
. В первом случае вы переопределитеOnAuthorization
. В последнем случае вы переопределитеIsAuthorized
. Как вы могли видеть из исходного кода этих атрибутов, ониOnAuthorization
помечены как виртуальные, чтобы вы могли их переопределить, если вы производите от нихAuthorizationFilterAttribute
. С другой стороны,IsAuthorized
метод отмечен как виртуальный вAuthorizeAttribute
. Я считаю, что это хороший указатель на предполагаемое использование.Ответ на этот вопрос заключается в том, как в целом работает объектно-ориентированный объект. Если вы переопределяете метод, вы можете либо полностью предоставить новую реализацию, либо использовать реализацию, предоставленную родителем, и улучшить поведение. Например, возьмем случай
IsAuthorized(HttpActionContext)
. Поведение базового класса - проверить пользователя / роль на соответствие тому, что указано в фильтре, и установленной идентичности. Скажем, вы хотите сделать все это, но, кроме того, вы хотите проверить что-то еще, возможно, на основе заголовка запроса или чего-то еще. В этом случае вы можете предоставить такое переопределение.Извините, но не понимаю ваш вопрос 3. Кстати, фильтр авторизации существует уже давно, и люди используют его для всех видов вещей, а иногда и неправильно.
Парень, который сказал, что это Бог контроля доступа - Доминик. Очевидно, это будет правильно. Если вы посмотрите на реализацию
OnAuthorization
(скопировано ниже),вызов
SkipAuthorization
- это та часть, которая обеспечивает применениеAllowAnonymous
фильтров, то есть пропуск авторизации. Если вы переопределите этот метод, вы потеряете это поведение. На самом деле, если вы решите основывать свою авторизацию на пользователях / ролях, на этом этапе вы бы решили наследоватьAuthorizeAttribute
. Единственный правильный вариант, который вам останется на этом этапе, - это переопределить,IsAuthorized
а не уже переопределенныйOnAuthorization
, хотя технически это возможно сделать и то, и другое.PS. В веб-API ASP.NET есть еще один фильтр, называемый фильтром проверки подлинности. Идея состоит в том, что вы используете это для аутентификации и фильтр авторизации для авторизации, как указывает название. Однако есть множество примеров, когда эта граница не соответствует действительности. Многие примеры фильтров авторизации будут выполнять какую-то аутентификацию. В любом случае, если у вас есть время и вы хотите понять немного больше, взгляните на эту статью MSDN . Отказ от ответственности: это написал я.
источник
OnAuthorization
в своей книге о переопределении . Я уверен, что не написал бы о проверке ответа на null, потому что я впервые слышу об этом :)Хорошо, я предлагаю сделать следующее, предполагая, что вы используете токены носителя OAuth для защиты своего веб-API, и вы устанавливаете allowedTime в качестве утверждения для пользователя при выдаче токена. Вы можете узнать больше об аутентификации на основе токенов здесь
переопределить метод
OnAuthorizationAsync
и использовать пример кода ниже:источник
AuthorizeAttribute
который наследуется,AuthorizationFilterAttribute
а также для обучения я специально спросил, какой метод мне следует использовать, и о том, что ответ имеет контент или нет ...ASP.NET v5 представила совершенно новую систему авторизации. Тем, кто собирается использовать .NET 5, я предлагаю перейти на Microsoft.AspNet.Authorization.
В значительной степени это завершает беспорядок, вызванный сохранением как
System.Web.Http.Authorize
и, такSystem.Web.Mvc.Authorize
и других старых реализаций аутентификации.Он обеспечивает очень хорошую абстракцию типов действий (создание, чтение, обновление, удаление), ресурсов, ролей, утверждений, представлений, пользовательских требований и позволяет создавать собственные обработчики, комбинируя любые из вышеперечисленных. Кроме того, эти обработчики также можно использовать в комбинации.
источник