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?
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