Vai al contenuto

Configurazione

La configurazione proviene da appsettings.json, dagli override specifici per ambiente (appsettings.Development.json), dai user secrets e dalle variabili d'ambiente, secondo la precedenza standard di ASP.NET Core (le variabili d'ambiente sovrascrivono i user secrets, che sovrascrivono appsettings.{Environment}.json, che sovrascrive appsettings.json).

I segreti non vengono deliberatamente inclusi nei commit: gli appsettings*.json tracciati contengono solo i livelli di logging e DevAuth. In locale questo vuoto viene colmato con dotnet user-secrets set (vedi Setup di sviluppo); in un container viene colmato con variabili d'ambiente, usando __ come separatore di sezione (ConnectionStrings__SchulyDatabase).

Stringa di connessione al database

SchulyDbContext legge la stringa di connessione denominata SchulyDatabase (ConnectionStrings:SchulyDatabase), cablata in DatabaseExtensions. Il retry automatico in caso di errore è abilitato per gli errori transitori di Postgres.

Forniscila tramite configurazione o una variabile d'ambiente, ad es.:

sh
export ConnectionStrings__SchulyDatabase="Host=localhost;Port=2406;Database=schuly-dev;Username=postgres;Password=..."

Autenticazione OIDC

L'autenticazione JWT bearer convalida i token rispetto all'authority OIDC configurata (AddSchulyAuthentication):

ChiaveScopo
Oidc:AuthorityAuthority OIDC (Keycloak) usata per convalidare i bearer token.
Oidc:RequireHttpsMetadataSe i metadati HTTPS sono richiesti (predefinito true).

Mappatura dei claim del token:

  • name → nome visualizzato (NameClaimType).
  • il claim groups → ruolo (RoleClaimType). I valori dei gruppi vengono mappati sui ruoli applicativi Student, Teacher e Administrator.
  • La convalida dell'audience è disabilitata (ValidateAudience = false).

Al primo token valido per un utente sconosciuto, l'API sincronizza l'utente a partire dal token (AddUserSync / IUserService).

Autenticazione di sviluppo (DevAuth)

In ambiente Development puoi abilitare un percorso locale di finto-OIDC al posto di un IdP reale. Con DevAuth:Enabled = true (vedi appsettings.Development.json), l'API si fida dei token generati da /api/dev/token, firmati con una chiave simmetrica, usando DevAuth:Issuer (predefinito schuly-dev). Nessun identity provider esterno viene contattato. Non abilitare DevAuth in produzione.

Documento OpenAPI

Oidc:Authority viene letto anche quando il documento OpenAPI viene generato, per pubblicizzare il flusso OAuth2 authorization-code. È richiesto anche quando DevAuth sostituisce l'identity provider reale: senza di esso /openapi/v1.json restituisce 500 (Oidc:Authority not configured) e la UI Scalar risulta vuota, dato che la renderizza a partire da quel documento. Oidc:ClientId precompila il client id nella finestra di autorizzazione della UI di riferimento.

Storage dei documenti (S3)

I blob di documenti e avatar vanno in un bucket compatibile S3 (SeaweedFS negli stack inclusi), configurato sotto S3::

ChiaveScopo
S3:EndpointEndpoint S3, ad es. http://localhost:8333.
S3:BucketNome del bucket.
S3:AccessKey / S3:SecretKeyCredenziali. Devono corrispondere a quelle nel s3-config.json di SeaweedFS.
S3:UsePathStyletrue per SeaweedFS e la maggior parte delle implementazioni S3 self-hosted.

Firma degli URL degli avatar

ChiaveScopo
Avatar:SigningKeyChiave HMAC per gli URL firmati e di breve durata degli avatar. Generala con openssl rand -hex 32.

Il database conserva solo una chiave blob nuda; un URL di capability firmato viene generato a ogni accesso. La chiave viene letta in modo lazy, quindi un valore mancante emerge come Avatar:SigningKey is not configured. alla prima firma di un URL avatar, non all'avvio.

Policy di autorizzazione

La policy predefinita (di fallback) richiede un utente autenticato per ogni endpoint (AddSchulyAuthorization). Gli endpoint possono escludersi con [AllowAnonymous]. La superficie anonima /api/app (ad es. il catalogo dei sistemi scolastici e gli asset statici dei loghi sotto wwwroot) è raggiungibile senza autenticazione, così che l'app possa caricare il proprio catalogo di login. Gli endpoint di amministrazione dei plugin sotto /api/plugins richiedono il ruolo Administrator.

Plugin

La configurazione dell'host dei plugin (URL del registro, file dei plugin desiderati, directory) è descritta in Gestione dei plugin.

Logging

I livelli di logging sono impostati sotto Logging:LogLevel in appsettings.json. L'override di Development eleva il logging HTTP a Information per il tracing delle richieste.