Ho implementato un sistema di autenticazione senza password (dove gli utenti effettuano il login solo usando un "link magico" inviato alla loro email) da solo. So che progettare sistemi di sicurezza senza esperienza è davvero pessimo, quindi chiedo di sapere se il mio sistema ha buchi evidenti. Ecco come funziona:
- L'utente digita la sua email e amp; un nome utente univoco nel client JS (SPA)
- L'email e l'amp; il nome utente viene inviato al mio server API (in GET / stringa di query)
- Il server API consulta il database degli utenti (vedi sotto per la progettazione di questo DB) per vedere se l'email esiste già
- In caso contrario, l'email viene aggiunta al database degli utenti insieme al nome utente (nuovo utente)
- Se lo fa, il server API assicura che il nome utente corrisponda all'email, altrimenti risponde con un errore
- Il server API genera un GUID ad alta entropia (stringa lunga e casuale) e lo memorizza nel database degli utenti (nella stessa riga dell'email e del nome utente)
- Il server API invia all'utente un collegamento contenente il GUID in una stringa di query a una route speciale '/ auth /'
- Il server API memorizza l'ora esatta in cui questa email è stata inviata nel database degli utenti
- Se il collegamento non è stato premuto entro 30 minuti da quel momento, il GUID viene rimosso dal database degli utenti (quindi l'utente deve accedere nuovamente a)
- Se il collegamento è stato premuto nel tempo, il server API genera un nuovo GUID di sessione, lo memorizza nel Database utenti e amp; inserisce un cookie scambiato in tutte le richieste future (ad esempio ogni volta che si verifica una nuova richiesta, il server API assicura che il GUID della sessione corrisponda a quello nel database degli utenti, a indicare che sono connessi)
- Il GUID della sessione viene rimosso dal database degli utenti se l'utente decide di disconnettersi
- Anche il GUID della sessione viene rimosso ogni 3 giorni (quindi gli utenti devono accedere ogni 3 giorni)
Il database utenti presenta le seguenti colonne, con username
come chiave primaria:
| username | email | magic_link_guid | magic_link_guid_date | session_guid | session_guid_date |
Alcuni problemi che non so come risolvere:
- Viene effettuata una chiamata al database per ogni richiesta, che non può essere buona
- La gestione dei ruoli utente sarebbe davvero difficile con questo metodo
- Questo sembra suscettibile agli attacchi XSS / CRSF
Ancora una volta, so che il mio sistema non funziona correttamente, ma non riesco a trovare un sistema priva di password pronto per .NET / C #: (.