# 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_PASSWORD` per 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 1. **`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 2. **`Data_Coupler\Pages\Login.razor`** - Pagina di login con form a tutto schermo - Design responsivo e moderno - Gestione errori con messaggi visivi ### File Modificati 1. **`Data_Coupler\Program.cs`** - Aggiunta registrazione del servizio di autenticazione come Singleton ```csharp builder.Services.AddSingleton(); ``` 2. **`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 3. **`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 1. Avviare l'applicazione 2. Verrà visualizzata automaticamente la pagina di login 3. Inserire la password: `admin123` 4. Cliccare su "Accedi" 5. Verrete reindirizzati alla pagina principale DataCoupler ### Logout 1. In qualsiasi momento, cliccare sul pulsante "Logout" in alto a destra 2. Verrete disconnessi e la pagina di login verrà visualizzata nuovamente ## Modificare la Password Per modificare la password hardcoded: 1. Aprire il file `Data_Coupler\Services\AuthenticationService.cs` 2. Trovare questa riga: ```csharp private const string HARDCODED_PASSWORD = "admin123"; ``` 3. Modificare `admin123` con la password desiderata 4. 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 1. `App.razor` verifica `AuthService.IsAuthenticated` 2. Se `false` → Mostra `Login.razor` 3. Se `true` → Mostra `Router` con tutte le pagine 4. `AuthService` notifica i cambiamenti via eventi 5. I componenti usano `InvokeAsync()` per aggiornamenti thread-safe 6. 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 autentica - `Logout()`: Disconnette l'utente - `IsAuthenticated`: Proprietà per verificare lo stato ## Testing Per testare il sistema: 1. **Test Login Corretto**: - Aprire l'applicazione - Inserire password: `admin123` - Verificare reindirizzamento a DataCoupler 2. **Test Login Errato**: - Inserire password sbagliata - Verificare messaggio di errore "Password non corretta" 3. **Test Protezione Pagine**: - Provare ad accedere direttamente a URL come `/credentials`, `/profiles`, etc. - Verificare che venga mostrata la pagina di login 4. **Test Logout**: - Effettuare login - Cliccare sul pulsante "Logout" - Verificare che venga mostrata nuovamente la pagina di login 5. **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 1. **Persistenza Sessione**: Salvare stato autenticazione in cookie o session storage 2. **Multi-Utente**: Supporto per più utenti con credenziali diverse 3. **Database Password**: Salvare password in database criptate 4. **Remember Me**: Opzione per mantenere login attivo 5. **Password Recovery**: Sistema di recupero password 6. **2FA**: Autenticazione a due fattori 7. **Audit Log**: Log degli accessi e tentativi falliti 8. **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.razor` contenga la logica di controllo autenticazione - Assicurarsi che il servizio sia iniettato correttamente