Error 403 en producción de WindowsAzure.Storage

Tengo una aplicación WebForms que usa WindowsAzure.Storage API v3. Funciona bien en el desarrollo y en un entorno de producción, pero estoy implementando una nueva instancia y cualquier código que llame Azure Blob Storage me da un error 403.

He estado jugando con esto por un tiempo, y falla en cualquier llamada al Blob Storage, así que en lugar de mostrar mi código, mostraré mi seguimiento de pila:

[WebException: The remote server returned an error: (403) Forbidden.],
   System.Net.HttpWebRequest.GetResponse() +8525404
   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) +1541

[StorageException: The remote server returned an error: (403) Forbidden.]
   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) +2996
   Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.CreateIfNotExists(BlobContainerPublicAccessType accessType, BlobRequestOptions requestOptions, OperationContext operationContext) +177
   ObsidianData.Azure.Storage.GetContainer(CloudBlobClient client, Containers targetContainer) in D:\Dev\nSource\Obsidian\Source\ObsidianData\Azure\Storage.vb:84
   ObsidianWeb.Leads.HandleListenLink(String fileName, HyperLink link) in D:\Dev\nSource\Obsidian\Source\ObsidianWeb\Bdc\Leads.aspx.vb:188
   ObsidianWeb.Leads.LoadEntity_ContactDetails(BoLead lead) in D:\Dev\nSource\Obsidian\Source\ObsidianWeb\Bdc\Leads.aspx.vb:147
   ObsidianWeb.Leads.LoadEntity(BoLead Lead) in D:\Dev\nSource\Obsidian\Source\ObsidianWeb\Bdc\Leads.aspx.vb:62
   EntityPages.EntityPage`1.LoadEntity() +91
   EntityPages.EntityPage`1.Page_LoadComplete(Object sender, EventArgs e) +151
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4018

Esto es lo que he intentado ...

El AzureStorageConnectionString que falla en este entorno definitivamente funciona en producciónOtras cadenas de conexión (del otro entorno de producción, que funciona) también obtienen un 403 aquíParecía haber un problema con las marcas de tiempo en algunas versiones antiguas de la API REST (que no estoy usando directamente ...), así que me aseguré de que las horas sean correctas, incluso intenté cambiar el servidor a la hora UTC.Intenté alternar la cadena de conexión entre http / https.Actualizado a la última versión de la API (v3.1)Intenté jugar con el código para asegurar que cada llamada a Azure Storage recibiera 403. Lo hace.Desesperado, instalé Azure Powershell en el servidor solo para verificar que algún tipo de comunicación con Azure funciona. Y eso funcionó bien.Navegué hasta el portal de administración azul y eso funciona bien.

¿Algunas ideas? Esto debería estar usando el puerto 80 o 443, ¿verdad? Por lo tanto, no debería haber forma de que esto sea algún tipo de problema de red. Avísame si eso está mal.

La máquina de producción en funcionamiento es una máquina virtual de Azure (Server 2008 R2 con IIS 7.5). También hay algunas diferencias con el servidor:Esta nueva máquina es hardware físico (Server 2012 e IIS 8)Esto ES usando una cuenta de almacenamiento diferente dentro de mi suscripción azul, sin embargo, he probado un total de 3 cadenas de conexión y ninguna de ellas funciona aquí.

ACTUALIZAR: alguien pidió ver el código. Bien, escribí una clase llamada Azure.Storage, que simplemente resume mi código de almacenamiento en la nube. Estamos fallando en una llamada al almacenamiento. Existe, así que aquí está la parte de esa clase que se siente relevante:

    Public Shared Function Exists(container As Containers, blobName As String) As Boolean
        Dim Dir As CloudBlobContainer = GetContainer(container)
        Dim Blob As CloudBlockBlob = Dir.GetBlockBlobReference(blobName.ToLower())

        Return Blob.Exists()
    End Function

    Private Shared Function GetContainer(client As CloudBlobClient, targetContainer As Containers)
        Dim Container As CloudBlobContainer = client.GetContainerReference(targetContainer.ToString.ToLower())
        Container.CreateIfNotExists()
        Container.SetPermissions(New BlobContainerPermissions() With {.PublicAccess = BlobContainerPublicAccessType.Blob})

        Return Container
    End Function

    Private Shared Function GetCloudBlobClient() As CloudBlobClient
        Dim Account As CloudStorageAccount = CloudStorageAccount.Parse(Settings.Cloud.AzureStorageConnectionString())

        Return Account.CreateCloudBlobClient()
    End Function

...Contenedores es solo una enumeración de nombres de contenedor (hay varios):

 Public Enum Containers
     CallerWavs
     CampaignImports
     Delve
     Exports
     CampaignImages
     Logos
     ReportLogos
     WebLinkImages
 End Enum

... Sí, tienen caracteres en mayúscula, lo que causa problemas. Todo se ve obligado a minúsculas antes de que se apague.

También verifiqué que la AzureConnectionString correcta está saliendo de mi clase de configuración. Nuevamente, probé algunos que funcionan en otro lugar. ¡Y este también funciona en otro lugar!

Respuestas a la pregunta(2)

Su respuesta a la pregunta