Files
Data-Coupler/SISTEMA_LOGIN.md
T
Alessio Dal Santo 22c0a15b8e feat(auth): Implementazione completa sistema autenticazione
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
2025-10-08 17:58:46 +02:00

198 lines
7.2 KiB
Markdown

# 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<Data_Coupler.Services.IAuthenticationService, Data_Coupler.Services.AuthenticationService>();
```
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