2012-07-18 4 views
7

Si verificano problemi con i BLOB di Azure e le firme di accesso condiviso quando scadono. Devo concedere l'accesso a un BLOB per più di 1 ora (7 giorni), quindi sto utilizzando una politica contenitore denominata, ma sfortunatamente non riesco a generare nuovi URL una volta che questi 7 giorni sono scaduti.Firma accesso condiviso contenitore BLOB di Azure in scadenza

Ho il seguente codice per creare il criterio "predefinito". Nota In questo codice, sto impostando la scadenza per essere 1 minuto dalla società, per rendere più facile da testare:

CloudStorageAccount account = new CloudStorageAccount(credentials, true); 

CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials); 

CloudBlobContainer container = client.GetContainerReference("files"); 

SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy(); 
sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; 
sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); 

BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions(); 
blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy); 

container.SetPermissions(blobContainerPermissions); 

Ho quindi creare un URL SharedAccessSignature con il seguente:

CloudStorageAccount account = new CloudStorageAccount(credentials, true); 

CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials); 

CloudBlobContainer container = client.GetContainerReference("files"); 

CloudBlob blob = container.GetBlobReference(path); 

string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy(), "default"); 

Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

Questo genera un url e l'url funziona correttamente per il minuto successivo (o 7 giorni nel codice reale). Una volta che il minuto è finito, l'url non è valido e non funziona più, come previsto.

Ma una volta scaduta la scadenza, eseguo nuovamente il codice per generare un nuovo URL. Sfortunatamente, genera lo stesso url, che non è ancora valido.

sono i tempi di inizio/fine per le politiche di contenitori in assoluto, cioè quando ho impostato che la politica in questo momento:

sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); 

nulla usando che la politica è valida solo dalle 10:10 (EDT) a 10:11 (EDT) oggi?

+0

Così i tempi di inizio/fine per le politiche contenitore sono in assoluto. Anch'io pensavo che fossero parenti. – nmit026

risposta

9

Una cosa che potresti fare è creare il tuo criterio di accesso senza data di scadenza. Specifica la data di scadenza quando crei l'URL firmato.

Così il vostro codice sarà qualcosa di simile:

 SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy(); 
     sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; 
     sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
     //sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); No need to define expiry time here. 

     BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions(); 
     blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy); 

     container.SetPermissions(blobContainerPermissions); 

     Console.WriteLine("Press any key to continue...."); 
     Console.ReadLine(); 
     CloudBlob blob = container.GetBlobReference(path); 

     string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy() 
     { 
      SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7),//add expiry date only when you're creating the signed URL 
     } 
      , "default"); 

     Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

     Process.Start(new ProcessStartInfo(blob.Uri.AbsoluteUri + sas)); 

     Console.WriteLine("Press any key to continue...."); 
     Console.ReadLine(); 

Sarà questo lavoro per te? Ovviamente è necessario rigenerare l'URL dopo 7 giorni, ma non è necessario apportare alcuna modifica al criterio di accesso.

Spero che questo aiuti.

+1

Grazie per la risposta. Sfortunatamente, se si stanno utilizzando i criteri di accesso al contenitore, non è possibile specificare alcun parametro aggiuntivo durante la creazione della firma di accesso condiviso. L'errore è "I campi della politica di accesso possono essere associati alla firma o all'identificatore SAS ma non a entrambi". – mfanto

+0

Sono d'accordo. È per questo che ho escluso SharedAccessExpiryTime dal criterio di accesso (ho commentato quella riga di codice) e l'ho incluso nell'URL firmato. –

+0

La mia scusa, ho perso il commento. Funziona e mi evita di dover riscrivere una grande porzione di codice. Grazie, molto ben fatto. – mfanto

0

Con una scadenza di 1 minuto è possibile che si verifichino effetti di distorsione dell'orologio tra la casella di generazione SAS e Windows Azure Storage. Dovresti usare un intervallo più lungo. Ho fatto un post andando nelle profondità gory delle firme di accesso condiviso, che potresti trovare utile.

+0

Grazie per il post. Sfortunatamente succede a prescindere dall'intervallo di tempo. L'ho scoperto originariamente perché avevo il tempo impostato su 7 giorni e, guardando i registri di commit, ho impostato il criterio di accesso 7 giorni fa. Penso che il problema sia che i tempi della politica del contenitore indicano il momento in cui la politica è stata creata, non gli url temporali generati.Il che ha senso, poiché GetSharedAccessSignature() non effettua alcuna chiamata di rete, non può generare firme uniche per le politiche – mfanto

0

È possibile che si stia raggiungendo il massimo nelle politiche di accesso a livello di contenitore.

Un criterio di accesso memorizzato include un nome lungo fino a 64 caratteri che è univoco all'interno del contenitore. Questo nome viene visualizzato nel campo signedidentifier in Firme accesso condiviso che si collegano a un criterio di accesso memorizzato. Un contenitore può includere fino a 5 criteri di accesso memorizzati. Ogni politica può essere utilizzata da qualsiasi numero di firme di accesso condiviso.

Using a Stored Access Policy

+0

Ho solo un criterio di accesso a livello di contenitore. Penso che la risposta sia un equivoco che ho, e cioè i tempi della politica del contenitore sono impostati quando la politica viene creata, non quando vengono generati gli URL. – mfanto

+0

Ti sento. Una portata ma queste due linee potrebbero generare una nuova politica. Controlla la raccolta per un conteggio. Ancora una volta. – Paparazzi

+0

@Blam Questo essenzialmente sostituirà tutte le politiche esistenti che si possono avere sul contenitore blob. Per preservare i criteri di accesso esistenti, è necessario trasferirli nella raccolta "SharedAccessPolicies". –