2013-07-09 37 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