Nel mio lavoro ci è stato affidato l'incarico di implementare l'autenticazione a due fattori su un certo numero di nostre applicazioni web che attualmente condividono un database di credenziali (autenticazione moduli asp.net) ma hanno il loro codice per raccogliere e convalidare credenziali, ecc.
Pensando a questo problema ho pensato che questo potrebbe essere un buon momento per consolidare tutta la nostra autenticazione in un unico servizio web (FWIW sto guardando IdentityServer ) che tutte le nostre varie applicazioni web potrebbero utilizzare.
A mio parere questo segue il principio DRY, renderà più semplice l'implementazione e il test della stessa 2FA e porterà a un sistema più gestibile in futuro. Tuttavia, nel discutere il mio piano con un collega, ha suggerito che sto introducendo un singolo punto di errore nel sistema e che se fosse stato introdotto un bug nel servizio di autenticazione, tutte le applicazioni sarebbero state scaricate. Per essere chiari, non stiamo parlando della disponibilità del servizio (il servizio verrebbe ospitato con lo stesso livello di infrastruttura resiliente delle altre applicazioni che il mio collega accetta come ragionevole), ma sul potenziale di un singolo bug per eliminare tutte le nostre applicazioni . Il suo suggerimento è che scriviamo l'autenticazione nelle singole applicazioni o dovremmo fornire una sorta di sistema di autenticazione ridondante per il sistema primario che non funziona.
Per me questo argomento si sente nel modo sbagliato. Se dipendiamo da diverse implementazioni per impedire che tutti i nostri servizi falliscano, lo stiamo facendo male. Tuttavia non sono riuscito a mettere un caso convincente per fare un collega. Alcuni degli argomenti che ho avanzato:
- Questo non è diverso dall'usare le librerie tra i progetti - Se un bug critico in alcune di queste librerie dovesse raggiungere la produzione potrebbe ridurre un numero di nostre applicazioni - ma non stiamo suggerendo che non dovremmo condividere il codice Qui. Questo è concettualmente diverso?
- Anche se c'è spazio per miglioramenti, non abbiamo un terribile processo di test / distribuzione. Utilizziamo l'integrazione continua, abbiamo test unitari automatizzati, un ambiente di test ragionevole e script di test manuali (per non menzionare la possibilità di annullare una distribuzione di produzione se otteniamo un bug). Anche se i bug continueranno a essere superati, questo processo è la mitigazione di ciò, non scrivere le cose due volte.
- Per sua natura, il processo di autenticazione non è il tipo di cosa che subirà regolarmente modifiche importanti. Una volta che abbiamo un sistema di autenticazione che funziona, probabilmente lo lasceremo, rischiando di rompere qualcosa di abbastanza basso.
- Il principio ASCIUTTO - Non scrivere la stessa cosa più volte più probabilità di portare a bachi ed essere un incubo da mantenere di avere un servizio?
- L'idea di un'implementazione di autenticazione ridondante è piuttosto folle per me. Forse se stessimo scrivendo il software autopilota per un aereo di linea, ma non per applicazioni web non critiche per la sicurezza.
Il mio collega non è convinto. Ho sbagliato? Se non lo sono, qual è l'argomento killer che mi manca qui?