5

Qual è la semantica prevista per più filtri di autenticazione? È permesso? e se sì, come lavorano insieme?ASP.net Web API 2 controller con filtri di autenticazione multipli

Ecco un esempio specifico. Supponiamo di avere una classe controller come

[BasicAuthenticator] 
[LocalAuthenticator] 
[Authorize] 
public class TestController : ApiController 
{ 
    [AllowAnonymous] 
    public IHttpActionResult GetProduct(int id) 
    { 
    } 

    // etc. etc 
} 

in cui BasicAuthenticator e LocalAuthenticator attuare IAuthenticationFilter.

Ogni autenticatore avrà la possibilità di avere successo. Se uno dei due riesce, imposta context.Principal su un nuovo oggetto con ClaimsIdentity appropriato (nome, tipo e isAuthenticated = true).

Cosa succede se un autenticatore fallisce? Penso che non dovrebbe fare nulla, così che l'altro avrà la possibilità di avere successo. Destra?

E se entrambi hanno successo? Qualunque cosa vada in secondo luogo cancella il Preside creato dal primo? Non avrebbe più senso unire le collezioni ClaimsIdentity dei due oggetti principali insieme?

Se un autenticatore fallisce, non dovrebbe fare nulla, corretto? Perché l'altro autenticatore potrebbe avere successo. La semantica di avere due autenticatori è che l'azione verrà eseguita se uno dei due riesce, corretto?

Penso che la classe Authorize guarderà tutte le ClaimsIdentity nel principal, e se ClaimsIdentity ha "isAuthenticated = true" allora consentirà l'esecuzione del controller. Altrimenti, imposterà lo stato = 401. Questo sembra essere il modo in cui funziona. È corretto?

Lo scopo di [AllowAnonymous] è disattivare tutti gli altri filtri di autorizzazione, correggere? Il controller (o il metodo di azione) è decorato con [AllowAnonymous] quindi presumo che debba sempre essere eseguito, anche se l'autenticazione fallisce. È corretto?

risposta

-2

L'ultimo filtro di autenticazione da eseguire correttamente blocca semplicemente il preside. Quando osservi l'oggetto principale e le raccolte Claims ridicolmente complesse ad esso associate, penserai che tutta questa complessità è sicuramente destinata a supportare più autenticazioni di successo! Ma ti sbaglieresti. Solo uno può avere successo. Non c'è motivo per la complessità, se non quella di assecondare la vanità di qualche architetto in Microsoft.

+0

Il paradigma per l'autenticazione è più simile a "un'identità per metodo di autenticazione". Il ClaimsPrincipal può essere utilizzato per interrogare le sue molteplici istanze di ClaimsIdentity sottostanti. Hai provato a fare in modo che ciascuno dei tuoi filtri aggiungesse semplicemente una nuova identità al principal esistente, invece di costruire un nuovo principal? – tuespetre

2

Con la recente filtro di autenticazione introdotta in Web API 2, immagino uno si suppone di introdurre uno attributo per l'autenticazione, e forse attributo uno per l'autorizzazione, come squadra MS diviso queste due preoccupazioni. Quindi la semantica è di avere uno per l'autenticazione.

Mi sembra che il fatto è possibile aggiungere più di un attributo di autenticazione è solo un coincidenza, perché si capita per impostare filtri sui controllori e le loro azioni per mezzo di attributi, e come è possibile aggiungere più di un attributo ... Lo stesso vale per l'impostazione del filtro di autenticazione a livello di progetto, su tutte le azioni di tutti i controllori: poiché si può aggiungere più di un filtro, non implica necessariamente che uno debba aggiungere più di un filtro di autenticazione allo.

Se è necessario supportare più di un meccanismo di autenticazione (ad es.a Basic e Local), si potrebbe semplicemente avere un singolo attributo/filtro che intercetta la richiesta e che proverà entrambi i meccanismi, implementando qualsiasi logica AND/OR che potrebbe essere necessaria.

+1

Non è vero. Leggi questo blog da MS, http://www.asp.net/web-api/overview/security/authentication-filters In particolare, dove dice "Se ... il filtro non riconosce lo schema di autenticazione, non fa nulla e restituisce (no-op). Un altro filtro nella pipeline potrebbe comprendere lo schema. " Il che implica che possa esistere più di un filtro di autenticazione. –

+0

Hai ragione su questo. Penso di non essermi espresso nel modo migliore. Il punto è che si possono avere più attributi/filtri, ma la logica che li combina non può essere personalizzata. Invece è in qualche modo * imposto * dall'alto: se l'autenticazione passa, l'identità (o cos'altro) viene impostata e passa al filtro/all'attributo successivo. Se fallisce, in pratica tutti i passaggi successivi della catena devono essere saltati. Quindi se il seguente è di nuovo un'altra autenticazione, è fondamentalmente inutile: o troverà l'identità già impostata, o potrebbe non essere nemmeno invocata. – superjos

+0

* EDIT * Non sono riuscito a trovare prima del bit dove dice specificatamente come dovrebbe funzionare il concatenamento di più filtri di autenticazione. Si trova nella sezione * Implementazione del metodo AuthenticateAsync *. Questa è la logica di concatenamento fuori dalla scatola. – superjos