Я читаю из нескольких ресурсов (книги и ответы 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)
Н.Б.
Обратите внимание: я использую (и хочу использовать) только AuthorizeAttribute
, который уже наследует от AuthorizationFilterAttribute
Почему?
Becuase Я нахожусь на первом этапе: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
В любом случае, я спрашиваю через расширение атрибута Authorize.