Autorizzazione personalizzata in Asp.net WebApi – che casino?

Sto leggendo da diverse risorse (libri e risposte SO) sull’authorization in WebApi.

Supponiamo di voler aggiungere un attributo personalizzato che consenta l’accesso solo a determinati utenti:

Caso 1

Ho visto questo approccio di sovrascrivere OnAuthorization , che imposta la risposta se qualcosa non va

 public class AllowOnlyCertainUsers : AuthorizeAttribute { public override void OnAuthorization(HttpActionContext actionContext) { if ( /*check if user OK or not*/) { actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); } } } 

Caso n. 2

Ma ho anche visto questo esempio simile che sovrascrive OnAuthorization ma con la chiamata alla base :

 public override void OnAuthorization(HttpActionContext actionContext) { base.OnAuthorization(actionContext); // If not authorized at all, don't bother if (actionContext.Response == null) { //... } } 

Quindi, si controlla se HttpActionContext.Response è impostato o meno. Se non è impostato, significa che la richiesta è autorizzata e l’utente è a posto

Caso n. 3

Ma ho anche visto questo approccio di sovrascrivere IsAuthorized :

 public class AllowOnlyCertainUsers : AuthorizeAttribute { protected override bool IsAuthorized(HttpActionContext context) { if ( /*check if user OK or not*/) { return true;// or false } } } 

Caso n. 4

E poi ho visto un esempio simile, ma con la chiamata di base. Isautorizzato (contesto):

 protected override bool IsAuthorized(HttpActionContext context) { if (something1 && something2 && base.IsAuthorized(context)) //?? return true; return false; } 

Un’altra cosa

E finalmente Dominick ha detto qui :

Non devi ignorare OnAuthorization, perché mancherebbe la [AllowAnonymous] gestione.

Domande

  • 1) Quali metodi dovrei usare: IsAuthorized o OnAuthorization ? (o quando usare quale)

  • 2) quando dovrei chiamare base. È base.IsAuthorized or base. “Autorizzazione”?

  • 3) È così che l’hanno costruito? che se la risposta è nulla allora tutto è ok? (caso n. 2)

NB

Si prega di notare, sto usando (e voglio usare) solo AuthorizeAttribute che già eredita da AuthorizationFilterAttribute

Perché ?

Sono al primo passaggio in: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

inserisci la descrizione dell'immagine qui

Comunque sto chiedendo tramite estendere l’attributo Authorize.