Я читаю з декількох ресурсів (книги та відповіді) про авторизацію в 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 (контекст):
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
базу. Про авторизацію`?3) Це, як вони його побудували? що якщо відповідь недійсна, то все нормально? (випадок №2)
NB
Зауважте, я використовую (і хочу використовувати) лише те, AuthorizeAttribute
що вже успадковане AuthorizationFilterAttribute
Чому?
Тому що я на першому етапі: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
У будь-якому випадку я запитую через розширений атрибут Авторизація.