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

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_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
    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:
    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