Azure Storage è tra i primi servizi nati all'interno della piattaforma Microsoft Azure ed è lo strumento principale che possiamo utilizzare se necessitiamo di depositare file in modo sicuro, affidabile, completamente gestito e performante.
I blob sono contenuti all'interno dei container e dispongono di un meccanismo di protezione semplice, ma allo stesso tempo molto potente. Quando ci ritroviamo a salvare file il cui accesso dev'essere regolato da policy particolari, l'unica scelta che abbiamo è di rendere il container privato e di conseguenza disporre dell'URI della risorsa non è più sufficiente per poterla scaricare o manipolare. Quello che otteniamo è un 404 che mette al riparo il file da qualsiasi uso inappropriato.
Se però disponiamo di una pagina HTML dove per esempio mostriamo una lista di immagini protette, dobbiamo temporaneamente dare accesso alle stesse e solo per l'utente corrente. Per raggiungere questo scopo, nell'elaborazione server side della risposta che genera il JSON o l'HTML, possiamo generare degli indirizzi temporanei così da permettere al browser di scaricare e visualizzare l'immagine. Questo è possibile grazie al fatto che gli URI possono contenere una firma, detta Shared Access Signature (SAS), che contiene al suo interno i permessi che l'utente ha sulla risorsa. Questa firma può essere generata solo avendo una delle due chiavi dello storage.
Utilizzando l'SDK di .NET, per esempio, possiamo ottenere il riferimento ad un CloudBlockBlob di nostro interesse e utilizzare il metodo GetSharedAccessSignature per ottenere una firma da porre in coda all'indirizzo originale, come mostrato nell'esempio.
// Credenziali account CloudStorageAccount account = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;...."); CloudBlobClient client = account.CreateCloudBlobClient(); // Ottengo il container CloudBlobContainer container = client.GetContainerReference("myContainer"); CloudBlockBlob blob = container.GetBlockBlobReference("myImage.png"); // Permessi e scadenza della policy var policy = new SharedAccessBlobPolicy() { SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-1), SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1), Permissions = SharedAccessBlobPermissions.Read }; string token = blob.GetSharedAccessSignature(policy); string uri = blob.Uri + token;
La policy che viene creata determina i permessi sul file e gli intervalli temporali di validità, i quali verranno inseriti nella query string, insieme alla firma, producendo un indirizzo simile a myContainer/myImage.png?sv=2018-03-28&sr=b&sig=?&st=2019-06-24T21%3A07%3A10Z&se=2019-06-24T21%3A09%3A10Z&sp=r. L'aspetto interessante è che per produrre questa firma non è necessario nessuna chiamata server to server. L'operazione è immediata e può essere effettuata per ogni singola immagine. In questo modo possiamo anche permetterci di generare token dalla validità molto breve. Se l'utente aggiorna la pagina possiamo poi generare ancora nuovi token dando URI che dopo un minuto perderanno di utilità.
Infine, se disponiamo già dell'indirizzo completo, possiamo usare il costruttore di CloudBlockBlob dando l'intero indirizzo e passando le credenziali, al fine di poter invocare sempre GetSharedAccessSignature.
// Ottengo il blob CloudBlockBlob blob = new CloudBlockBlob(new Uri("https://myStorage.blob.core.windows.net/myContainer/myImage.png"), account.Credentials);
L'unica cosa da prestare attenzione, se generiamo molti indirizzi, è quella di evitare quei metodi che fanno ricorso a chiamate verso lo storage, come per esempio GetBlobReferenceFromServerAsync.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare il controllo CarouselView in Xamarin Forms
Utilizzare Ivy in un progetto Angular 8
Utilizzare il framework FluentValidation con ASP.NET Core
Diagnosticare i problemi di performance con MiniProfiler su ASP.NET Core MVC
Applicare un firewall web con Azure Front Door
Effettuare ping e DNS lookup nelle Azure Web App
Le novità di .NET Core 3.0
Restringere l'accesso tramite IP ad Azure App Service
What's coming in .NET and C# 8 (.NET Conference Italia 2018)
What's new in Azure
Personalizzazioni avanzate del parsing della richiesta in ASP.NET Core
Eseguire script PowerShell multi-linea in Azure DevOps
I più letti di oggi
- DevOps in a .NET world
- What's new in Xamarin and Visual Studio for macos
- Building modern web apps with Blazor
- WPF and Windows Apps in .NET Core 3
- ASP.NET Core 2
- Blazor: un viaggio nello state management
- C# 8
- ecco tutte le novità pubblicate sui nostri siti questa settimana: http://aspit.co/wkly buon week-end!