Il Cross-Origin Resource Sharing (CORS) è una caratteristica di HTTP che permette a soluzioni web di supportare scenari cross dominio. Nelle nostre pagine HTML, infatti, non è possibile per motivi di sicurezza effettuare richieste su indirizzi diversi dal dominio corrente. Negli scenari moderni però, è sempre più frequente la necessità di dover chiamare API su un dominio diverso, nostro o di terze parti.
Per supportare questi scenari, lo standard CORS prevede che il client possa effettuare una chiamata di tipo OPTIONS all'indirizzo sui cui andrà effettuata la chiamata e da quest'ultimo ottenere informazioni quali i domini chiamanti consentiti, i metodi HTTP, gli header HTTP e la durata totale della cache.
Questo meccanismo risulta utile quando utilizziamo i servizi di Azure Storage, soprattutto quando sfruttiamo le Shared Access Signature per permettere direttamente al client di salvare Blob, Table o Queue, e sfruttare al massimo la scalabilità. Normalmente i servizi sono esposti sotto il dominio xxx.core.windows.net e questo ci impedirebbe di effettuare chiamate da JavaScript, per esempio. Possiamo però istruire i servizi di Azure Storage affinché rispondano alle richieste CORS con i domini da noi consentiti.
Per farlo possiamo usare come al solito le REST API o le client library per .NET. In questo script usiamo quest'ultime che attraverso i metodi GetServiceProperties e SetServiceProperties permettono di impostare le CorsRule, come nell'esempio.
var p = client.GetServiceProperties(); p.Cors = new CorsProperties(); p.Cors.CorsRules.Add(new CorsRule() { AllowedOrigins = new List<string>() { "miodominio.it" }, AllowedHeaders = new List<string>() { "*" }, // qualsiasi AllowedMethods = CorsHttpMethods.Get | CorsHttpMethods.Head | CorsHttpMethods.Post, ExposedHeaders = new List<string>() { "*" }, // qualsiasi MaxAgeInSeconds = 1800 // 30 minuti }); client.SetServiceProperties(p);
Oltre a specificare esattamente i parametri possiamo utilizzare la wildcard per accettare qualsiasi valore, ma sconsigliamo tale utilizzo al fine di poter essere mirati ed evitare attacchi remoti da domini di cui non ci fidiamo. Infine, sono consentiti fino ad un massimo di cinque regole e, una volta impostate, hanno effetto subito.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare gli snapshot con Azure File shares
Miglioramenti nelle performance di Angular 16
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Creare gruppi di client per Event Grid MQTT
Usare il versioning con i controller di ASP.NET Core Web API
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Utilizzare domini personalizzati gestiti automaticamente con Azure Container Apps
Short-circuiting della Pipeline in ASP.NET Core
Limitare le richieste lato server con l'interactive routing di Blazor 8
Miglioramenti nell'accessibilità con Angular CDK
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
I più letti di oggi
- PWAConf 2020 - Online
- Effettuare il binding di date in Blazor
- What's new in Azure Functions and Extensions
- Mantenere sempre reattiva una Lambda di AWS
- Proteggersi dagli attacchi di Open Redirect in ASP.NET Core MVC
- Gestire errori funzionali tramite exception in ASP.NET Core Web API
- Sblocca le performance della tua applicazione con .NET 8