In un contesto di produzione, spesso è preferibile evitare di esporre un sito ASP.NET Core direttamente sul web, sfruttando invece un reverse proxy. Questa soluzione offre infatti diversi vantaggi, sia dal punto di vista della sicurezza, ma soprattuto pratico:
- TLS termination: installando i certificati TLS sul reverse proxy, lasciando la comunicazione tra il proxy e i web server in HTTP;
- Routing, tramite cui esporre più applicazioni logicamente distinte dietro il medesimo dominio;
- Load balancing, distribuendo il traffico su diversi web server in modo da ottenere una maggiore scalabilità.
Per chi dovesse essere interessato, abbiamo parlato di questo argomento in un precedente evento su ASPItalia.com:
https://media.aspitalia.com/events/devconf12-yarp.media
Un aspetto importante da tenere sempre presente, in questo contesto, è che il nostro sito web riceverà il traffico solo in maniera indiretta, pertanto se provassimo ad accedere all'HttpRequest corrente, vedremmo informazioni non aggiorante: per esempio, l'indirizzo IP del chiamante che non sarà quello dell'utente effettivo, ma quello del reverse proxy, o l'host della richiesta che (in alcuni casi) potrebbe non corrispondere all'indirizzo vero a proprio invocato dall'utente.
Le implicazioni sono ovvie: pensiamo al caso del logging, o voler restringere gli IP ammessi a una certa regione geografica, o la generazione del ReturnUrl nel caso di redirect a un identity provider in fase di autenticazione.
Come ovviare a questo problema? Ogni reverse proxy inoltrerà questo tipo di informazioni tramite degli header standard:
- X-Forwarded-For, contentente l'IP del chiamante;
- X-Forwarded-Proto, contenente il protocollo originale (HTTP o HTTPS);
- X-Forwarded-Host, che invece contiene l'host originario.
In ASP.NET Core, possiamo attivare una funzionalità chiamata ForwardedHeaders per reimpostare l'HttpRequest tenendo in considerazione anche questi header.
Nel file Program.cs dobbiamo innanzi tutto configurare il servizio specificando di quali headers vogliamo fare il forward:
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; });
Successivamente, ci basta aggiungere il corrispondente middleware, di solito nella posizione più esterna nella pipeline di ASP.NET Core:
var app = builder.Build(); app.UseForwardedHeaders(); // altri middleware qui
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare la session affinity con Azure Container Apps
Disabilitare automaticamente un workflow di GitHub (parte 2)
Short-circuiting della Pipeline in ASP.NET Core
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Controllare gli accessi IP alle app con Azure Container Apps
Semplificare il deployment di siti statici con Azure Static Web App
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Eseguire operazioni sui blob con Azure Storage Actions
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Utilizzare database e servizi con gli add-on di Container App
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
I più letti di oggi
- I nuovi metodi degli array di ECMAScript 5
- Evitare (o ridurre) il repo-jacking sulle GitHub Actions
- Un custom control BoundField con dropdownlist
- .NET Core 3, C#8 and beyond
- Utilizzare long polling in HTML5 per richieste in real time
- Utilizzare le shortcut da tastiera con KeyboardAccelerator nella Universal Windows Platform
- Microsoft Security Bulletin MS05-048