Czytam z kilku źródeł (książek i odpowiedzi SO) na temat autoryzacji w WebApi.
Załóżmy, że chcę dodać atrybut niestandardowy, który umożliwia dostęp tylko dla niektórych użytkowników:
Przypadek 1
Widziałem takie podejście do nadpisywania OnAuthorization
, które ustawia odpowiedź, jeśli coś jest nie tak
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ( /*check if user OK or not*/)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}
}
Przypadek 2
Ale widziałem też ten podobny przykład, który również jest nadrzędny, OnAuthorization
ale z wzywaniem do base
:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
// If not authorized at all, don't bother
if (actionContext.Response == null)
{
//...
}
}
Następnie sprawdzasz, czy
HttpActionContext.Response
jest ustawiony, czy nie. Jeśli nie jest ustawiona, oznacza to, że żądanie jest autoryzowane, a użytkownik jest w porządku
Przypadek 3
Ale widziałem też takie podejście do zastępowania IsAuthorized
:
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext context)
{
if ( /*check if user OK or not*/)
{
return true;// or false
}
}
}
Przypadek 4
I wtedy zobaczyłem podobny przykład, ale z wywoływaniem bazy.IsAuthorized (context):
protected override bool IsAuthorized(HttpActionContext context)
{
if (something1 && something2 && base.IsAuthorized(context)) //??
return true;
return false;
}
Jeszcze jedna rzecz
I wreszcie Dominick powiedział tutaj :
Nie należy nadpisywać OnAuthorization - ponieważ brakowałoby obsługi [AllowAnonymous].
pytania
1) Jakich metod powinienem użyć:
IsAuthorized
lubOnAuthorization
? (lub kiedy użyć którego)2) kiedy powinienem zadzwonić do
base.IsAuthorized or
bazy OnAuthorization?3) Czy tak to zbudowali? że jeśli odpowiedź jest zerowa, to wszystko jest w porządku? (sprawa nr 2)
NB
Proszę zauważyć, że używam (i chcę używać) tylko tego, AuthorizeAttribute
co już dziedziczy z AuthorizationFilterAttribute
Czemu ?
Ponieważ jestem na pierwszym etapie w: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
W każdym razie pytam przez rozszerzenie atrybutu Authorize.