
WebApplication .NET in una farm (Data Protection API)
L'installazione di un'applicazione .NET 10 in una web farm bilanciata richiede una gestione centralizzata dei cookie di sicurezza.
Per consentire a ogni server di leggerli e scriverli, i cookie devono essere criptati e firmati con gli stessi criteri di crittografia.
In questo caso ci viene in aiuto la Data Protection API (DPAPI).
Svolge un ruolo simile a quello che era il MachineKey di ASP.NET 1.x ÷ 4.x.
Per usare la Data Protection API è sufficiente aggiungere questo codice che richiama il metodo AddDataProtection():
con questi settings
In pratica serve una cartella di rete condivisa da tutti i server della farm dove, solo l'utente dell'application pool può leggere/scrivere.
.NET 10 creerà un file XML, in chiaro, con le chiavi di encryprion che periodicamente cambierà per garantire la massima sicurezza.
Per ulteriore sicurezza il file XML può essere cryptato tramite certificato (vedi metodo ProtectKeysWithCertificate()).
In questo caso il certificato deve essere installato su tutte le macchine nel Personal Certificate Store delll'utente dell'application pool.
Per consentire a ogni server di leggerli e scriverli, i cookie devono essere criptati e firmati con gli stessi criteri di crittografia.
In questo caso ci viene in aiuto la Data Protection API (DPAPI).
Svolge un ruolo simile a quello che era il MachineKey di ASP.NET 1.x ÷ 4.x.
Per usare la Data Protection API è sufficiente aggiungere questo codice che richiama il metodo AddDataProtection():
C#: Program.cs
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
// using Microsoft.AspNetCore.DataProtection;
string? dataProtectionKeysPath = builder.Configuration.GetValue<string>("AppOptions:DataProtectionKeysPath");
if (string.IsNullOrWhiteSpace(dataProtectionKeysPath))
{
// in un appliccazione reale il messaggio è scritto nei log, non in console
Console.WriteLine("DataProtectionKeysPath non configurato, le chiavi di protezione dei dati saranno memorizzate in memoria e non saranno persistenti.");
// in sviluppo o con 1 solo server non è necessario configurarlo
}
else
{
builder.Services.AddDataProtection()
// univoco per ogni applicazione, per condividere i cookie tra più istanze della stessa app
.SetApplicationName("WebApplication1-app")
// assiucuarsi che solo l'utente dell'applicazione abbia accesso alla cartella di rete condivisa
.PersistKeysToFileSystem(new DirectoryInfo(dataProtectionKeysPath))
// per proteggere le chiavi con un certificato (opzionale)
//.ProtectKeysWithCertificate("thumbprint")
;
}
JSON: appsettings.json
{
"AppOptions": {
"DataProtectionKeysPath": "\\\\serverName\share\\webapp-keys\\NomeWebApp",
...
}
}
.NET 10 creerà un file XML, in chiaro, con le chiavi di encryprion che periodicamente cambierà per garantire la massima sicurezza.
Per ulteriore sicurezza il file XML può essere cryptato tramite certificato (vedi metodo ProtectKeysWithCertificate()).
In questo caso il certificato deve essere installato su tutte le macchine nel Personal Certificate Store delll'utente dell'application pool.
Senza questa configurazione, un utente autenticato tramite Microsoft Entra ID potrebbe riscontrare errori di autenticazione intermittenti qualora il bilanciatore lo reindirizzasse su un server diverso da quello iniziale.
Se il bilanciatore è impostato per mantenere l'affinità di sessione questi errori intermittenti non si presentano.
Ma in uno scenario di farm è sempre meglio usare DPAPI
Ma in uno scenario di farm è sempre meglio usare DPAPI