Asp.net

來自 WindowsAzure.Storage 的生產中出現 403 錯誤

  • July 20, 2021

我有一個使用 WindowsAzure.Storage API v3 的 WebForms 應用程序。它在開發和一個生產環境中執行良好,但我正在推出一個新實例,任何呼叫 Azure Blob 儲存的程式碼都會給我一個 403 錯誤。

我一直在擺弄這個,它在任何呼叫 Blob 儲存時都失敗了,所以我不會顯示我的程式碼,而是顯示我的堆棧跟踪:

[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

這是我嘗試過的…

  • 在此環境中失敗的 AzureStorageConnectionString 肯定在生產中有效
  • 其他連接字元串(來自其他有效的生產環境)也在這裡得到 403
  • 在一些舊版本的 REST api(我沒有直接使用…)中,時間戳似乎存在問題,所以我確定時間是正確的,甚至嘗試將伺服器切換到 UTC 時間。
  • 嘗試切換 http/https 之間的連接字元串。
  • 升級到最新版本的 API (v3.1)
  • 嘗試修改程式碼以確保對 Azure 儲存的每次呼叫都得到 403。確實如此。
  • 無奈之下,在伺服器上安裝了 Azure Powershell,只是為了驗證與 Azure 的某種類型的通信是否正常。這很好用。
  • 也瀏覽到 azure 管理門戶,效果很好。

有任何想法嗎?這應該只是使用埠 80 或 443,對吧?所以這不應該是某種網路問題。讓我知道這是否是錯誤的。

  • 工作的生產機器是 Azure VM (Server 2008 R2 with IIS 7.5) 與伺服器也有一些區別:
  • 這台新機器是物理硬體(Server 2012 和 IIS 8)
  • 這是在我的 azure 訂閱中使用不同的儲存帳戶,但是我總共嘗試了 3 個連接字元串,但它們都不能在這里工作。

**更新:**有人要求查看程式碼。好的,我寫了一個名為 Azure.Storage 的類,它只是抽象了我的雲儲存程式碼。我們在呼叫 Storage.Exists 時失敗了,所以這是該類中感覺相關的部分:

   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

Containers只是容器名稱的列舉(有幾個):

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

…是的,它們有大寫字元,這會導致問題。一切都在消失之前被強制小寫。

此外,我確實驗證了正確的 AzureConnectionString 來自我的設置類。再次,我嘗試了一些其他地方的工作。這個也適用於其他地方!

請檢查相關伺服器上的時鐘。除了不正確的帳戶密鑰外,如果伺服器上的時間與儲存伺服器上的時間不同步,您還會收到 403 錯誤(允許存在 +/- 15 分鐘的偏差)。

我也遇到了這個錯誤。我的問題是我在 web.config 中打開了動態 IP 安全限制,並且在某些情況下(例如,帶有大量圖像的頁面)下載的文件數量超過了我在 web.config 中定義的最大門檻值。

引用自:https://stackoverflow.com/questions/22828279