Alcune delle applicazioni che realizziamo sono multi-tenant, ovvero hanno la capacità di offrire un servizio a vari clienti diversi da un'unica installazione.
Per identificare ed isolare i vari tenant (clienti) esistono varie soluzioni, come destinare a ciascuno di essi un particolare dominio di terzo livello:
nometenant.dominio.it altrotenant.dominio.it ...
Questo approccio non è poi così complesso da realizzare. Infatti, sia i maggiori provider di servizi DNS che l'eventuale certificato SSL che potremmo procurarci, supportano entrambi i domini wildcard, cioè scritture del tipo *.dominio.it. Con Windows 10 (e prossimamente su Windows Server 2016), anche il webserver IIS 10 permette di configurare un wildcard binding:

Con quest'unica e semplice configurazione prepariamo il sito a ricevere richieste da un qualsiasi dominio di terzo livello che ogni nostro cliente avrà scelto di usare.
Dall'applicazione ASP.NET, ovviamente, avremo la necessità di inviare query al database filtrando i risultati in base al nome del tenant corrente. Per ottenerlo, la cosa più immediata che possiamo fare è estrarlo dalla proprietà Request.Url.Host.
Tuttavia, per non avere dipendenze dall'oggetto Request e migliorare perciò la testabilità del nostro controller, è preferibile che il nome del tenant ci venga fornito dall'esterno, come argomento dell'action:
public ActionResult Index(string tenant) { // ... }
Affinché il Model Binder di ASP.NET MVC possa fornirci il valore corretto, andiamo a modificare in questo modo la route di default, che tipicamente troviamo nel file /App_Start/Route_Config.cs:
routes.MapRoute ( name: "Default", url: "{controller}/{action}/{id}", // Introduciamo un nuovo frammento chiamato "tenant"... defaults: new { tenant = "www", controller = "Home", action = "Index", id = UrlParameter.Optional }, // ...e lo vincoliamo ad un costraint constraints: new { tenant = new TenantRouteConstraint() } );
Qui fruttiamo un constraint al solo scopo di eseguire del codice all'arrivo di ogni richiesta. Ci occorre per recuperare il nome del tenant dall'hostname corrente ed aggiungerlo ai dati di routing. Andiamo perciò a creare nel progetto una classe TenantRouteConstraint che assolverà tale compito. Creaiamo il file di codice TenantRouteConstraint.cs in una cartella qualsiasi, come ad esempio in /Constraints.
// Implementiamo il metodo Match di IRouteConstraint public class TenantRouteConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (routeDirection == RouteDirection.IncomingRequest) { // Otteniamo il nome del tenant con una espressione regolare var tenantNameRegex = new Regex(@"(.+)\..+\..+"); var match = tenantNameRegex.Match(httpContext.Request.Url.Host); if (match.Success) { // Se il valore è stato trovato, lo assegniamo al dizionario values[parameterName] = match.Groups[1].Value; } } return true; } }
A questo punto, visitando la nostra applicazione da un URL come http://aspitalia.dominio.it, riceveremo il valore aspitalia come nome del tenant.

Ora siamo liberi di usare questo valore per filtrare i risultati dal database (o scegliere un database appropriato) e mostrare al tenant solo i dati che lo riguardano.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Disabilitare un pulsante in Blazor durante il salvataggio
Creare un account Azure Cosmos DB gratuito
Use Firebase in Progressive Web Apps
Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
Cambiare automaticamente lo stato di un work item in una pipeline di Azure DevOps
Cambiare il DNS da utilizzare negli Azure App Service
Impostare e validare il tipo dei parametri nei template delle pipeline di Azure DevOps
Creare un component che renderizza una lista in JSX
Proteggere le risorse Azure da cancellazioni involontarie
Versioning automatico degli Azure Storage Blob
Utilizzare .NET Core 3.1 con le Azure Function
Usare le user assigned identity per accedere a Azure SQL Database tramite AAD
I più letti di oggi
- Modificare la modalità di esecuzione delle query con Include in Entity Framework Core 5
- Le novità di Entity Framework Core 5
- Autenticazione con JWT Token e ASP.NET Core Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Creare un web server locale con LiveReload
- Effettuare l'upload di un file da Blazor su Azure Blob Storage
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Tracciabilità dei work item nel ciclo di vita del software con Azure DevOps