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.
Se l'azione del controller è asincrona, è necessario sovrascrivere il metodo OnAuthorizationAsync?
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.
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