2017-07-26 51 views
1

我試圖直接從瀏覽器使用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

我爲什麼會得到這個CORS錯誤?另外,爲什麼關於授權頭的錯誤?

我認爲使用SAS URI的想法是不必向客戶端公開帳戶名稱/密鑰。

我錯過了什麼嗎?

+0

同一個人從該博客文章:)。您是在blob容器還是blob上創建SAS?從你的代碼看來,你似乎是在blob而不是容器上做的。有沒有更多的代碼沒有包含在問題中?如果是這樣,那麼請在問題中加入。 –

+0

@GauravMantri我編輯了部分,我展示瞭如何調用兩種C#方法。我會認爲我在集裝箱級別做SAS代,也許我的眼睛在愚弄我...... –

+0

謝謝!我相信問題是你正在創建一個容器的URI作爲名稱的塊blob。所以你的BLOB的名字是'https:// youraccount.blob.core.windows.net/supercontainer'。以下是我的建議:請讓'CreateBlobContainer'返回容器對象而不是blob,然後創建一個SAS,即'GetSaSForBlobContainer'的第1個參數的類型是'CloudBlobContainer'而不是'CloudBlockBlob'。請嘗試一下。 –

回答

3

您鏈接的博客文章假定要在blob容器上創建共享訪問簽名,而不是blob,因爲您並不真正知道文件用戶將事先上傳的名稱。然而,在你的代碼中,你正在創建blob而不是blob容器的SAS,這就是爲什麼你會得到403錯誤。

要解決此問題,請更改您的CreateBlobContainer方法,並讓它返回CloudBlobContainer而不是CloudBlockBlob的對象。然後,請更新您的GetSaSForBlobContainer,並將其第一個參數的類型爲CloudBlobContainer而不是CloudBlockBlob。一旦你做出這些改變,你不應該得到你所得到的403錯誤。

相關問題