2015-04-02 7 views
7

Abbiamo recentemente implementato l'autenticazione dell'API implementando un AuthorizationFilterAttribute personalizzato, utilizzando le credenziali archiviate nel DB di documenti di Azure. DocDB rende tutto utilizza Async.Quando WebApi2 utilizza OnAuthorizationAsync vs OnAuthorization

Attraverso gli esperimenti abbiamo rilevato che i controller sincroni WebApi2 utilizzeranno OnAuthorizationAsync se presente e OnAuthorization se nessun metodo asincrono. Abbiamo anche scoperto che i metodi dei controller Asyc possono utilizzare entrambi i metodi auth. Ma non sono sicuro al 100% che funzioni correttamente. Abbiamo visto solo quel codice che ha colpito i breakpoint.

Stranamente, è anche possibile sovrascrivere OnAuthorization contrassegnare come asincrone

public async override Task OnAuthorization(....)

Quest'ultimo metodo compila ed esegue bene, ma il controllore non attendere che il filtro di autenticazione per terminare l'esecuzione prima che il metodo azione inizia. Di solito il risultato è un errore ASP:

An asynchronous module or handler completed while an asynchronous operation was still pending

Sembra come questa manipolazione della esclusione avrebbe dovuto essere un errore di compilazione e non ha permesso.

Indipendentemente ... Ci sono molti misteri su AuthorizationFilterAttribute e alcuni altri post esistono sulla confusione. Custom Authorization in Asp.net WebApi - what a mess?

La mia domanda è come fai a sapere quale verrà eseguito e in quale ordine di precedenza? Appare se entrambi esistono nel filtro, viene eseguito solo un metodo.

  1. Se l'azione del controller è asincrona, è necessario sovrascrivere il metodo OnAuthorizationAsync?

  2. Se si dispone di asincrono nella propria logica di autenticazione e si è obbligati a utilizzare OnAuthorizationAsync (come lo sono io), ciò significa che devo modificare tutte le azioni del controller in modo che siano tutte azioni di controller asincrone?

Non riesco a trovare alcuna documentazione che elabori gli scenari per i filtri di azione asincrona.

+0

Se si inserisce un punto di interruzione in entrambi, verrà rilevato che OnAuthorizationAsync viene chiamato per primo; Se esamini lo stack di chiamate quando viene richiamato OnAuthorization, vedrai che è stato chiamato da qualche parte durante l'esecuzione di base.OnAuthorizationAsync(). – mjohnsonengr

risposta

7

Se si dà un'occhiata al codice sorgente di AuthorizationFilterAttribute allora si può vedere che l'implementazione di base di OnAuthorizationAsync è quella effettivamente chiamando OnAuthorization.

public virtual void OnAuthorization(HttpActionContext actionContext) 
{ 
} 

public virtual Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
{ 
    try 
    { 
     OnAuthorization(actionContext); 
    } 
    catch (Exception ex) 
    { 
     return TaskHelpers.FromError(ex); 
    } 

    return TaskHelpers.Completed(); 
} 

Come si può vedere, è possibile sovrascrivere il metodo desiderato e non è necessario chiamare l'implementazione di base. Basta scegliere quello che rende di più dal tuo scenario - non importa se il controller è asincrono o meno.

E per quanto riguarda le tue domande su marcatura OnAuthorization stessa come async - il codice compila dato che è il supporto C# asincrona modo è stato progettato, ma anzi fa sì che il codice chiamante per non aspettare per la parte asincrona per completare (in realtà può Attendere poiché il metodo è contrassegnato con vuoto asincrono e non async Attività. Ulteriori informazioni su async evitanohere.

Problemi correlati