Я читаю несколько ресурсов (книги и 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.