Asp.net
來自 WindowsAzure.Storage 的生產中出現 403 錯誤
我有一個使用 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 中定義的最大門檻值。