Un'applicazione web ASP.NET Core per la gestione dei corsi di formazione con autenticazione utente e database MSSQL.
- 🔐 Autenticazione: Login sicuro con email e password
- 📚 Gestione Corsi: Visualizzazione e ricerca corsi per titolo con evidenziazione
- � Ricerca Avanzata: Filtro real-time per titolo corso con contatori risultati
- �🗄️ Database MSSQL: Persistenza dati con Dapper ORM
- 🔄 Migrazioni Automatiche: FluentMigrator per la gestione dello schema
- 🐳 Docker Support: Containerizzazione completa con Docker Compose
- 🎨 UI Moderna: Interfaccia responsive con Bootstrap 5 e icone
- ⚡ Performance: Architettura HTML pura senza WebSocket/SignalR
BibeCatalogue/
├── Models/
│ └── Models.cs # Modelli dati (User, Course)
├── Services/
│ ├── DatabaseConnectionService.cs # Gestione connessioni DB
│ ├── UserService.cs # Logica autenticazione utenti
│ ├── CourseService.cs # Logica gestione corsi
│ ├── SessionService.cs # Gestione sessioni utente
│ └── DatabaseMigrationService.cs # Migrazioni database
├── Templates/
│ ├── login.html # Template pagina login
│ └── courses.html # Template dashboard corsi
├── Migrations/
│ └── InitialMigrations.cs # Schema e dati iniziali
├── wwwroot/
│ ├── app.css # Stili personalizzati
│ ├── favicon.ico # Icona del sito
│ └── test.html # Pagina di test (debug)
├── docker-compose.yml
├── Dockerfile
└── Program.cs # Configurazione app e endpoints
- .NET 8.0 SDK
- Docker e Docker Compose
- SQL Server (opzionale se si usa Docker)
-
Clona il repository (se applicabile):
git clone <repository-url> cd BibeCatalogue
-
Avvia l'applicazione con Docker Compose:
docker-compose up -d
-
Accedi all'applicazione:
- URL: http://localhost:8080
- Email:
test@example.com - Password:
password123
-
Arresta l'applicazione:
docker-compose down
-
Configura SQL Server:
- Avvia un'istanza SQL Server locale sulla porta 1433
- Oppure usa Docker:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong@Passw0rd" -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latest
-
Aggiorna la stringa di connessione in
appsettings.Development.json:{ "ConnectionStrings": { "DefaultConnection": "Server=localhost,1433;Database=BibeCatalogueDB_Dev;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=true;MultipleActiveResultSets=true;" } } -
Esegui l'applicazione:
dotnet run --urls "http://localhost:5000" -
Accedi all'applicazione:
- URL: http://localhost:5000
- Email:
test@example.com - Password:
password123
-
Prova le funzionalità:
- Dashboard con 4 corsi di esempio
- Ricerca per "C#", "Database", "Web", "Azure"
- Logout e re-login
Id(int, PK, Identity)Email(nvarchar(255), Unique)Password(nvarchar(255))FirstName(nvarchar(100))LastName(nvarchar(100))CreatedAt(datetime)
Id(int, PK, Identity)Title(nvarchar(200))StartDate(datetime)EndDate(datetime)Result(int, 0-30)UserId(int, FK -> Users.Id)
- Framework: ASP.NET Core 8.0 (HTML puro + Server-Side Rendering)
- Database: Microsoft SQL Server
- ORM: Dapper
- Migrazioni: FluentMigrator
- UI Framework: Bootstrap 5
- Icons: Bootstrap Icons
- Templating: HTML Templates con placeholder replacement
- Containerizzazione: Docker & Docker Compose
- Architettura: REST Endpoints + HTML Forms (nessun JavaScript client-side)
- Login elegante con form HTML e validazione server-side
- Gestione sessioni sicura con cookie HttpOnly
- Redirect automatico per utenti non autenticati
- Logout con pulizia sessione completa
- Visualizzazione lista corsi dell'utente con layout a griglia
- Barra di ricerca avanzata con filtro real-time per titolo
- Evidenziazione termine cercato nei risultati (highlight)
- Contatori risultati ("Trovati X corsi su Y per 'termine'")
- Bottone cancella ricerca per reset rapido
- Indicatori visivi per performance (badges colorati verde/rosso)
- Visualizzazione dettagli corso (date inizio/fine, voto)
- Migrazioni automatiche all'avvio applicazione
- Dati di esempio pre-caricati per test
- Query ottimizzate con Dapper e SQL parametrizzate
- Gestione connessioni sicura con using statements
- Architettura stateless senza WebSocket/SignalR
ASPNETCORE_ENVIRONMENT: Ambiente di esecuzione (Development/Production)ConnectionStrings__DefaultConnection: Stringa di connessione al database
- Timeout: 30 minuti
- Cookie HttpOnly e Essential
- Storage in memoria
- Le password sono salvate in chiaro per semplicità del demo
- In produzione implementare hashing sicuro (BCrypt, Argon2, ecc.)
- Implementare HTTPS obbligatorio
- Configurare CORS e CSP appropriatamente
- Usare Azure Key Vault per le stringhe di connessione
- Implementare rate limiting per login
- Aggiungere CSRF protection se necessario
✅ Sicurezza Attuale:
- Nessun problema antiforgery (architettura semplificata)
- Sessioni HttpOnly sicure
- Connessioni database parametrizzate (protezione SQL injection)
- Validazione server-side completa
- Endpoint:
/health - Controlla lo stato dell'applicazione
- Console logging in Development
- Configurabile per Production
- Hashing password sicuro (BCrypt/Argon2)
- Paginazione lista corsi (per grandi volumi)
- CRUD completo corsi (aggiungi/modifica/elimina)
- Filtri avanzati (per data, voto, stato)
- Esportazione dati (PDF, Excel)
- Dashboard statistiche con grafici
- Gestione categorie corsi
- Sistema notifiche email
- API REST per integrazioni
- App mobile companion
- Multitenancy per organizzazioni
- Test unitari e di integrazione
- CI/CD Pipeline automatizzata
- Logging strutturato (Serilog)
- Monitoraggio (Application Insights)
- Cache Redis per performance
- Autenticazione OAuth2/OIDC
-
Errore connessione database:
- Verificare che SQL Server sia in esecuzione
- Controllare la stringa di connessione
- Verificare le credenziali
-
Errore migrazioni:
- Controllare i permessi sul database
- Verificare la sintassi SQL nelle migrazioni
-
Pagina bianca o errori 404:
- Verificare che la cartella
Templates/esista - Controllare che i file
login.htmlecourses.htmlsiano presenti - Verificare i permessi di lettura sui template
- Verificare che la cartella
-
Errori di template:
- Verificare che tutti i placeholder
{{VARIABLE}}siano sostituiti - Controllare la sintassi HTML nei template
- Verificare i log per eccezioni di template rendering
- Verificare che tutti i placeholder
-
Errore Docker:
- Verificare che Docker sia in esecuzione
- Controllare i log:
docker-compose logs
-
Container "bibecatalogue-db" resta in "Waiting" o "Unhealthy":
- SQL Server richiede 1-2 minuti per l'inizializzazione al primo avvio
- Controllare i log:
docker-compose logs sqlserver - Se l'health check fallisce, verificare che
/opt/mssql-tools18/bin/sqlcmdsia disponibile
-
Errore "dependency failed to start: container is unhealthy":
- Il container dell'app web aspetta che il database sia "healthy"
- Lasciare più tempo per l'avvio del database
- Se il problema persiste:
docker-compose down && docker-compose up -d
# Visualizza log dell'applicazione
docker-compose logs web
# Visualizza log del database
docker-compose logs sqlserver
# Esegui in modalità sviluppo con log dettagliati
dotnet run --environment Development --urls "http://localhost:5000"
# Test endpoint health check
curl http://localhost:5000/health
# Pagina di test (solo per debug)
http://localhost:5000/testGET /→ Redirect al loginGET /login→ Pagina di loginPOST /login→ Processo di autenticazioneGET /courses→ Dashboard corsi (richiede autenticazione)GET /courses?search=termine→ Ricerca corsiGET /logout→ Logout e pulizia sessioneGET /health→ Health check applicazioneGET /test→ Pagina di test per debug
Per problemi o domande:
- Controllare i log dell'applicazione
- Verificare la configurazione del database
- Consultare la documentazione di Blazor Server
Questo progetto è un esempio educativo.