2013-07-09 41 views
2

我想獲取單個blob的共享訪問簽名,然後使用REST API下載blob。但是,我總是得到一個禁止的403錯誤消息。無論是在存儲模擬器還是雲端。這裏是我的代碼:Windows Azure共享訪問簽名總是給出:Forbidden 403

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myConnectionStringHere..."); 

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference("containerName"); 
CloudBlob blob = container.GetBlobReference("blobName"); 

string sasToken = blob.GetSharedAccessSignature(new SharedAccessPolicy() 
      { 
       Permissions = SharedAccessPermission.Read, 
       SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromHours(24) 
      } 
      ); 

string completeUri = string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sasToken); 

// now use the uri to make the rest call and download 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(completeUri); 
request.Method = "GET"; 
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) 
{ 
    using (Stream s = resp.GetResponseStream()) 
     { 
      using (FileStream fs = new FileStream("test.jpg", FileMode.Create, FileAccess.Write)) 
       { 
         byte[] buffer = new byte[8 * 1024]; 
         int len; 
         while ((len = s.Read(buffer, 0, buffer.Length)) > 0) 
         { 
          fs.Write(buffer, 0, len); 
         } 
        } 
       } 
      } 

調用GetResponse的時候我不斷收到403錯誤。任何幫助感謝!

編輯:忘了提:我使用的是最新的蔚藍SDK(2.0)

編輯2:我嘗試了很多,發現了一個名爲Azure的管理Studio工具。該工具能夠創建SAS令牌。我做到了,並將其與我的REST調用代碼一起使用。這工作得很好,所以錯誤必須在我寫的令牌創建代碼中。但是,sas字符串的格式完全相同。我不知道還有什麼嘗試

+0

你能提供一個你會使用的blob和容器名稱的例子嗎? –

+0

容器名稱:「cname」 blob名稱:「bname」 – Christian

+0

查看我的一些代碼,我使用:blob.Uri.AbsoluteUri + sasToken作爲url。 –

回答

7

有幾件事情,我注意到:

  1. 你提到你正在使用SDK 2.0,但是我覺得你沒有使用最新的存儲客戶端庫(2.0 0.6)。從你的代碼看來,你似乎還在使用舊的存儲客戶端庫(1.8)。如果您參考的是​​或Microsoft.WindowsAzure.Storage,您可以請檢查您的代碼嗎?如果它是以前的,那麼你正在使用舊圖書館。
  2. 如果您使用的是舊存儲客戶端庫,那麼請注意,對於使用舊存儲REST API的舊存儲客戶端庫,對於匿名SAS令牌(即沒有容器訪問策略的令牌),您不能指定到期時間從當前時間超過1小時(當然是UTC)。如果我嘗試使用您的網址,我收到以下錯誤信息(下AuthenticationErrorDetail節點:

沒有簽署標識符Access不能有時間超過1 小時

你可以試試創建SAS令牌有效期爲不超過1小時?如

var sasToken = blob.GetSharedAccessSignature(new SharedAccessPolicy 
    { 
     Permissions = SharedAccessPermission.Read, 
     SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(30) 
    } 
); 

如果繼續要使用舊的存儲客戶端庫,你有幾個通道oices:

  1. 創建一個有效時間不超過一小時的SAS令牌,如上所述。
  2. 使用容器級訪問策略創建SAS令牌。使用容器級別的訪問策略,您將能夠定義有效期超過1小時的SAS令牌。欲瞭解更多關於此,請點擊這裏:http://msdn.microsoft.com/en-us/library/windowsazure/ee393341.aspx

如果使用新的存儲客戶端庫,您將能夠確定持續時間較長的令牌,而無需使用容器訪問策略。然而,這兩個版本的庫之間存在很多差異,從舊版到新版的遷移並不是微不足道的。我前幾天寫了一篇關於將代碼從舊版本遷移到新版本的博文。你可以在這裏閱讀:http://gauravmantri.com/tag/storage-client-library/。最後,我寫了一篇關於SAS的博客文章,您可以在這裏閱讀:http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/

+0

非常感謝!你說得對,我的StorageClient版本是1.7! – Christian