我試圖直接從瀏覽器使用SAS密鑰上傳,因爲上傳的文件可能非常大(500MB-1GB +),我不希望它們通過我們在Azure上託管的後端。直接從客戶端使用SAS密鑰上傳到Azure存儲器
我正在關注this great post here,但我遇到了CORS問題,另一方面出現了403錯誤。
的CORS誤差
否「訪問控制允許來源」標題存在於所請求的資源 。原因'http://localhost:36923'因此不允許 訪問。響應的HTTP狀態代碼403.
正如你可以看到我試圖讓我的ASP MVC應用程序本地運行上傳到Azure出於測試目的。
而403錯誤接收:
403服務器無法驗證請求。確保 授權標頭的值正確地形成,包括簽名。
我產生我的SAS URI(其中明年到期,具有寫權限)的方法如下:
// First I create the blob container
public static CloudBlockBlob CreateBlobContainer(string strContainer)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"].ToString());
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(strContainer);
container.CreateIfNotExists();
CloudBlockBlob blockBlob = new CloudBlockBlob(container.Uri, new StorageCredentials(ConfigurationManager.AppSettings["AccountName"], ConfigurationManager.AppSettings["AccountKey"]));
return blockBlob;
}
//Then I create a SAS key for that container
public static string GetSaSForBlobContainer(CloudBlockBlob blob, SharedAccessBlobPermissions permission)
var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
Permissions = permission,
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime = DateTime.UtcNow.AddYears(1),
});
return string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas);
}
//Above methods invoked as such
container = FileManager.CreateBlobContainer("supercontainer");
var sasUri = FileManager.GetSaSForBlobContainer(container, SharedAccessBlobPermissions.Write);
所以我創建了一個容器,然後生成一個URI,允許上傳到它的年左右。
上面的sasUri
最終暴露在ASP MVC視圖中,可以通過javascript邏輯訪問。它是上述引用的博文的baseUrl
。
這裏的CORS我的容器上設置:
我爲什麼會得到這個CORS錯誤?另外,爲什麼關於授權頭的錯誤?
我認爲使用SAS URI的想法是不必向客戶端公開帳戶名稱/密鑰。
我錯過了什麼嗎?
同一個人從該博客文章:)。您是在blob容器還是blob上創建SAS?從你的代碼看來,你似乎是在blob而不是容器上做的。有沒有更多的代碼沒有包含在問題中?如果是這樣,那麼請在問題中加入。 –
@GauravMantri我編輯了部分,我展示瞭如何調用兩種C#方法。我會認爲我在集裝箱級別做SAS代,也許我的眼睛在愚弄我...... –
謝謝!我相信問題是你正在創建一個容器的URI作爲名稱的塊blob。所以你的BLOB的名字是'https:// youraccount.blob.core.windows.net/supercontainer'。以下是我的建議:請讓'CreateBlobContainer'返回容器對象而不是blob,然後創建一個SAS,即'GetSaSForBlobContainer'的第1個參數的類型是'CloudBlobContainer'而不是'CloudBlockBlob'。請嘗試一下。 –