Recentemente ho iniziato un progetto che coinvolge un'API REST. L'API richiede l'autenticazione con i requisiti per consentire agli amministratori di visualizzare gli utenti registrati e di revocare immediatamente sessioni di accesso specifiche. L'API viene utilizzata principalmente da una SPA e un'applicazione nativa.
Durante la mia ricerca di implementazioni esistenti in ASP.NET Core 2x ho comunque qualche problema. Sembra che ci siano 4 metodi principali di autenticazione:
- Cookie-based
- Token Web JSON
- OAuth 1 e 2
- Servizi di terze parti come Microsoft, Google, Twitter ecc.
A causa dell'utilizzo dell'API da parte di un'autenticazione nativa, l'autenticazione basata su cookie non è valida. Non è richiesto l'integrazione con terze parti (come Google), quindi non è nemmeno un'opzione. Allo stesso modo, non vi è alcun obbligo per l'API di essere utilizzato da un numero sconosciuto di applicazioni di terze parti, che effettivamente esclude OAuth.
Ora mi mancano i token Web JSON, ma ... Hanno anche problemi. Soprattutto il requisito della revoca immediata degli accessi è importante, tuttavia non è possibile quando si utilizzano i JWT. Una possibile soluzione è il mantenimento di un elenco di revoche, ma che sconfigge la loro natura senza stato poiché ogni richiesta all'API dovrebbe controllare questo elenco. Ma poiché questa non è un'applicazione su larga scala, la funzione senza stato non ha importanza al momento. Non posso usare i token con una breve durata in quanto il requisito per la revoca immediata non funziona bene con questo. Ecco un articolo , che spiega perfettamente i miei problemi con i JWT come sessioni.
Quindi ora siamo al grande problema. Non ci sono soluzioni supportate già disponibili in ASP.NET Core disponibili.
Domanda 1: eventuali alternative o osservazioni dei problemi citati in precedenza, che potrebbero modificare la conclusione?
Ho cercato il vasto spazio che è internet per qualsiasi cosa, che soddisfi i requisiti, ma non è in grado di trovare altro, ma JWT e OAuth ... Tutti usano JWT per tutto ciò che sembra. Quindi questo mi ha portato a ciò che temevo: ho bisogno di scrivere la mia implementazione :(
La soluzione ottimale sarebbe:
- Il client scambia nome utente / password per un token casuale
- Il client invia il token nell'intestazione HTTP
Authorization
molto simile a JWT. - Il token viene utilizzato per recuperare
AuthenticationTicket
dell'utente su una richiesta in entrata e il token è verificato. - Disconnessioni o revoche rimuove il token (ed efficacemente
AuthenticationTicket
) in un archivio centralizzato
Ricerca del codice sorgente per le soluzioni esistenti per l'autenticazione JWT e cookie principalmente in ASP.NET Core Mi rendo conto che posso riutilizzare un bel po 'delle implementazioni esistenti e integrarmi bene con il framwork, ma preferirei evitare di scrivere qualcosa di relativo alla sicurezza.
Domanda 2: qualcuno conosce un'implementazione che soddisfa questo flusso o può essere configurato per
Come nota conclusiva. So che archiviare lo stato della sessione lato server è contrario ai principi REST puri, ma lo trovo molto più pratico, visti i requisiti. Per superare eventuali problemi di ridimensionamento su un numero limitato di contenitori, prevedo di utilizzare un server centralizzato (come esempio) come cache / storage, che dovrebbe essere più che sufficiente a gestire il traffico previsto più volte.