22c0a15b8e
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
198 lines
7.2 KiB
Markdown
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
|