2012-07-18 21 views
7

Tengo problemas con Azure Blobs y las firmas de acceso compartido cuando caducan. Necesito otorgar acceso a un blob por más de 1 hora (7 días), así que estoy usando una política de contenedor con nombre, pero desafortunadamente parece que no puedo generar nuevos urls una vez que esos 7 días terminan.Firma de acceso compartido de contenedor de blobs azul que expira

Tengo el siguiente código para crear la política "predeterminada". Nota En este código, Soy la creación de la expiración de 1 minuto a partir de ahora, para que sea más fácil de prueba:

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); 

entonces crear una URL SharedAccessSignature con lo siguiente:

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); 

Este genera una url y la url funciona correctamente durante el siguiente minuto (o 7 días en el código real). Una vez que ha pasado el minuto, la url no es válida y ya no funciona, como se esperaba.

Pero una vez que la expiración ha pasado, ejecuto el código nuevamente para generar una nueva url. Desafortunadamente, genera la misma url, que aún no es válida.

son los tiempos de inicio/final de las políticas de contenedores absoluta, es decir, cuando me puse que la política en este momento:

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

cualquier cosa usando que la política sólo es válida a partir de las 10:10 am (EDT) a 10:11 (EDT) hoy?

+0

Así que los tiempos de inicio/final de las políticas de contenedores son absolutos. Yo también pensé que eran parientes. – nmit026

Respuesta

9

Una cosa que podría hacer es crear su política de acceso sin fecha de caducidad. Usted especifica la fecha de caducidad cuando está creando la URL firmada.

lo que el código sería algo como:

 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(); 

¿Funcionará para usted? Obviamente, necesitaría regenerar la URL después de 7 días, pero no tiene que hacer ningún cambio en su política de acceso.

Espero que esto ayude.

+1

Gracias por la respuesta. Lamentablemente, si usa políticas de acceso a contenedores, no puede especificar ningún parámetro adicional al crear la Firma de acceso compartido. El error es "Los campos de política de acceso se pueden asociar a la firma o al identificador SAS pero no a ambos". – mfanto

+0

Estoy de acuerdo. Es por eso que excluí el SharedAccessExpiryTime de la política de acceso (comenté esa línea de código) y lo incluí en la URL firmada. –

+0

Mis disculpas, me perdí el comentario. Esto funciona, y me ahorra tener que volver a escribir un gran trozo de código. Gracias, muy bien hecho. – mfanto

0

Con un vencimiento de 1 minuto, es posible que esté afectando a los efectos de sesgo del reloj entre el cuadro de generación de SAS y el almacenamiento de Windows Azure. Deberías usar un intervalo más largo. Hice un post yendo a las profundidades sangrientas de las firmas de acceso compartido, que podría serle útil.

+0

Gracias por la publicación. Desafortunadamente sucede independientemente del intervalo de tiempo. Originalmente lo descubrí porque tenía el tiempo establecido en 7 días y, al mirar los registros de confirmación, configuré la política de acceso hace 7 días. Creo que el problema es que los tiempos de las políticas de contenedor significan el momento en que se creó la política, no las URL de tiempo generadas.Lo cual tiene sentido, ya que GetSharedAccessSignature() no realiza ninguna llamada de red, no puede generar firmas únicas para las políticas – mfanto

0

Es posible que esté alcanzando el máximo en las políticas de acceso a nivel de contenedor.

Una política de acceso almacenado incluye un nombre de hasta 64 caracteres que es único dentro del contenedor. Este nombre aparece en el campo identificador de firma en Firmas de acceso compartido que se vinculan a una política de acceso almacenado. Un contenedor puede incluir hasta 5 políticas de acceso almacenadas. Cada política puede ser utilizada por cualquier número de Firmas de acceso compartido.

Using a Stored Access Policy

+0

Solo tengo una política de acceso a nivel de contenedor. Creo que la respuesta es un malentendido que tengo, y es que los tiempos de política de contenedor se establecen cuando se crea la política, no cuando se generan las URL. – mfanto

+0

Te escucho. Un alcance, pero esas dos líneas pueden generar una nueva política. Verifica la colección para contar. De nuevo un alcance. – Paparazzi

+0

@Blam Esto esencialmente sobrescribirá las políticas existentes que pueda tener en su contenedor blob. Para preservar sus políticas de acceso existentes, deberá pasarlas en su colección "SharedAccessPolicies". –

Cuestiones relacionadas