BREAKING CHANGE: Tutte le pagine ora richiedono autenticazione Nuove funzionalità: - Sistema di login con password hardcoded (admin123) - Form di login full-screen con gradiente viola - Protezione automatica di tutte le route - Pulsante logout visibile in tutte le pagine - Gestione thread-safe eventi autenticazione con InvokeAsync() Componenti: - AuthenticationService: servizio Singleton per gestione stato - Login.razor: pagina login con validazione e messaggi errore - App.razor: routing condizionale basato su autenticazione - MainLayout.razor: pulsante logout integrato Fix tecnici: - Risolto errore "Dispatcher not associated" usando InvokeAsync() - Implementato pattern corretto per eventi cross-thread in Blazor Server - Aggiunto Dispose per prevenire memory leak
7.2 KiB
Sistema di Login - Data Coupler
Panoramica
È stato implementato un sistema di login semplice con password hardcoded per proteggere l'accesso all'applicazione Data Coupler.
Caratteristiche Implementate
✅ Password Hardcoded
- Password predefinita:
admin123 - La password può essere modificata nel file
Data_Coupler\Services\AuthenticationService.cs - Cercare la costante
HARDCODED_PASSWORDper cambiarla
✅ Form di Login a Tutto Schermo
- La form di login viene visualizzata a schermo intero quando l'utente non è autenticato
- Design moderno con gradiente viola
- Icone e feedback visivo per errori di login
- Messaggio di errore se la password è errata
✅ Reindirizzamento alla Pagina DataCoupler
- Dopo un login riuscito, l'utente viene automaticamente reindirizzato alla pagina principale
/(DataCoupler) - Se un utente autenticato prova ad accedere a
/login, viene reindirizzato automaticamente alla home
✅ Protezione delle Pagine
- Nessuna pagina dell'applicazione è accessibile senza autenticazione
- Il sistema verifica lo stato di autenticazione prima di mostrare qualsiasi contenuto
- Se non autenticato, viene sempre mostrata la pagina di login
✅ Pulsante di Logout
- Posizionato in alto a destra nel MainLayout
- Visibile in tutte le pagine dell'applicazione
- Cliccando su "Logout", l'utente viene disconnesso e viene mostrata nuovamente la form di login
File Modificati/Creati
Nuovi File
-
Data_Coupler\Services\AuthenticationService.cs- Servizio di autenticazione con interfaccia
IAuthenticationService - Gestisce lo stato di autenticazione
- Contiene la password hardcoded
- Emette eventi quando lo stato di autenticazione cambia
- Servizio di autenticazione con interfaccia
-
Data_Coupler\Pages\Login.razor- Pagina di login con form a tutto schermo
- Design responsivo e moderno
- Gestione errori con messaggi visivi
File Modificati
-
Data_Coupler\Program.cs- Aggiunta registrazione del servizio di autenticazione come Singleton
builder.Services.AddSingleton<Data_Coupler.Services.IAuthenticationService, Data_Coupler.Services.AuthenticationService>(); -
Data_Coupler\App.razor- Logica di routing condizionale basata sullo stato di autenticazione
- Mostra Login se non autenticato, altrimenti mostra il Router
- Gestione automatica degli eventi di cambio stato autenticazione
-
Data_Coupler\Shared\MainLayout.razor- Aggiunto pulsante di logout in alto a destra
- Sostituito il link "About" con il pulsante "Logout"
Come Utilizzare
Login Iniziale
- Avviare l'applicazione
- Verrà visualizzata automaticamente la pagina di login
- Inserire la password:
admin123 - Cliccare su "Accedi"
- Verrete reindirizzati alla pagina principale DataCoupler
Logout
- In qualsiasi momento, cliccare sul pulsante "Logout" in alto a destra
- Verrete disconnessi e la pagina di login verrà visualizzata nuovamente
Modificare la Password
Per modificare la password hardcoded:
- Aprire il file
Data_Coupler\Services\AuthenticationService.cs - Trovare questa riga:
private const string HARDCODED_PASSWORD = "admin123"; - Modificare
admin123con la password desiderata - Ricompilare e riavviare l'applicazione
Sicurezza
⚠️ IMPORTANTE:
- Questo sistema utilizza una password hardcoded nel codice sorgente
- È adatto per ambienti di sviluppo o applicazioni interne
- Per ambienti di produzione, considerare:
- Salvare la password in configurazione criptata
- Implementare un sistema di autenticazione più robusto (es. Identity)
- Aggiungere supporto per più utenti
- Implementare hash delle password
- Aggiungere protezione contro attacchi brute force
Struttura Tecnica
Architettura
┌─────────────────┐
│ App.razor │ ← Punto di ingresso, verifica autenticazione
└────────┬────────┘
│
├─→ Non Autenticato ─→ Login.razor
│
└─→ Autenticato ─────→ Router ─→ MainLayout ─→ Pagine
│
└─→ [Logout Button]
Flusso di Autenticazione
App.razorverificaAuthService.IsAuthenticated- Se
false→ MostraLogin.razor - Se
true→ MostraRoutercon tutte le pagine AuthServicenotifica i cambiamenti via eventi- I componenti usano
InvokeAsync()per aggiornamenti thread-safe - I componenti si aggiornano automaticamente al cambio stato
Servizio di Autenticazione
- Tipo: Singleton (una sola istanza per tutta l'applicazione)
- Stato: Mantenuto in memoria durante l'esecuzione
- Eventi: Notifica i componenti quando lo stato cambia
- Thread-Safety: Utilizza
InvokeAsync()per aggiornamenti UI thread-safe - Metodi:
Login(password): Verifica password e autenticaLogout(): Disconnette l'utenteIsAuthenticated: Proprietà per verificare lo stato
Testing
Per testare il sistema:
-
Test Login Corretto:
- Aprire l'applicazione
- Inserire password:
admin123 - Verificare reindirizzamento a DataCoupler
-
Test Login Errato:
- Inserire password sbagliata
- Verificare messaggio di errore "Password non corretta"
-
Test Protezione Pagine:
- Provare ad accedere direttamente a URL come
/credentials,/profiles, etc. - Verificare che venga mostrata la pagina di login
- Provare ad accedere direttamente a URL come
-
Test Logout:
- Effettuare login
- Cliccare sul pulsante "Logout"
- Verificare che venga mostrata nuovamente la pagina di login
-
Test Persistenza Sessione:
- Effettuare login
- Navigare tra le varie pagine
- Verificare che rimanga autenticato
- Nota: Al refresh della pagina si perderà l'autenticazione (comportamento normale per Blazor Server senza persistenza)
Possibili Miglioramenti Futuri
- Persistenza Sessione: Salvare stato autenticazione in cookie o session storage
- Multi-Utente: Supporto per più utenti con credenziali diverse
- Database Password: Salvare password in database criptate
- Remember Me: Opzione per mantenere login attivo
- Password Recovery: Sistema di recupero password
- 2FA: Autenticazione a due fattori
- Audit Log: Log degli accessi e tentativi falliti
- Timeout Sessione: Logout automatico dopo inattività
🔧 Troubleshooting
Errore: "The current thread is not associated with the Dispatcher"
Problema: Errore intermittente durante login/logout
Soluzione: ✅ RISOLTO - Il sistema usa InvokeAsync() per garantire aggiornamenti UI thread-safe
Dettagli: Vedi FIX_LOGIN_DISPATCHER_ERROR.md per informazioni tecniche complete
Altri Problemi Comuni
Login non funziona
- Verificare che la password sia esattamente
admin123(case-sensitive) - Controllare la console browser per errori JavaScript
Logout non reindirizza
- Verificare che il servizio sia registrato come Singleton in
Program.cs - Controllare che
InvokeAsync()sia usato correttamente
Pagine accessibili senza login
- Verificare che
App.razorcontenga la logica di controllo autenticazione - Assicurarsi che il servizio sia iniettato correttamente