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
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user