I blob sono file organizzati a block o a page facilmente raggiungibili tramite richieste REST e quindi consumabili da qualsiasi client/server di qualunque piattaforma. Quando però si carica un file o si accede ad un container, questi sono accessibili solamente da parte di chi detiene una delle due chiavi, messe a disposizione dal portale Windows Azure e da utilizzare come valore dell'header Authorization di una richiesta.
Spesso però si deve permettere ad un utente di visualizzare o scaricare un file, oppure di caricarlo con strumenti client come può essere Silverlight. In Windows Azure è possibile usare per questo scopo la Shared Access Signature, una firma da porre in querystring della richiesta che, a differenza dell'header authorization, rende per prima cosa più semplice effettuare le chiamate ed inoltre fornisce un accesso al file in lettura e/o scrittura per una certa finestra temporale.
Ipotizzando quindi di voler permettere ad un client Silverlight di caricare un file, quello che è necessario fare è calcolare un URI sulla parte server, tramite ad esempio un servizio, e restituirlo al client. Nel codice seguente si calcola questo URI grazie al metodo GetSharedAccessSignature delle API managed, che prepara la parte di querystring da accodare all'URI originale.
// Creo il client per i Blob CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount; CloudBlobClient client = account.CreateCloudBlobClient(); CloudBlobContainer container = client.GetContainerReference("uploads"); // Calcolo il token per accedere al file CloudBlockBlob page = container.GetBlockBlobReference("test.txt"); string token = page.GetSharedAccessSignature(new SharedAccessPolicy { Permissions = SharedAccessPermissions.Write | SharedAccessPermissions.Read, // Scade fra 10 minuti SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10), SharedAccessStartTime = DateTime.UtcNow, }); // Calcolo l'uri completo: nessuna operazione viene effettuata sullo storage StorageCredentialsSharedAccessSignature tempAccount = new StorageCredentialsSharedAccessSignature(token); string blobUri = tempAccount.TransformUri(page.Uri.ToString());
Di particolare importanza sono le proprietà SharedAccessExpiryTime e SharedAccessStartTime per indicare rispettivamente quando la chiave scade e quando inizia la sua validità. Il primo è obbligatorio (se non già indicato a livello di container), mentre il secondo è facoltativo. La variabile blobUri che viene così calcolata sarà simile a questo URI:
La chiave è il Base64 di un hash calcolato sulla base della chiave amministrativa dello storage. E' importante quindi capire che questa chiave temporanea non può essere riprodotta e non è valida senza la chiave principale e ciò rende quest'ultima fondamentale per la sicurezza dell'applicazione. Infine, si consiglia sempre di usare chiavi la cui validità sia breve, per evitare che l'indirizzo possa essere usato da qualcuno che non dovrebbe disporre delle autorizzazioni per farlo.
Per chi fosse interessato alla costruzione della chiave senza API è possibile trovare la documentazione completa a questo indirizzo:
http://msdn.microsoft.com/en-us/library/ee395415.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Routing statico e PreRendering in una Blazor Web App
Limitare le richieste lato server con l'interactive routing di Blazor 8
Utilizzare i primary constructor di C# per inizializzare le proprietà
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Effettuare il binding di date in Blazor
Aggiungere interattività lato server in Blazor 8
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Creare gruppi di client per Event Grid MQTT
Criptare la comunicazione con mTLS in Azure Container Apps
Utilizzare la session affinity con Azure Container Apps
Sfruttare al massimo i topic space di Event Grid MQTT
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)