2014-02-05 40 views
1

我有一些代碼可以給我一個天藍色blob中的pdf上的共享訪問簽名。爲C#中的塊blob生成共享訪問簽名

class Program 
    { 
     static void Main(string[] args) 
     { 

      CloudStorageAccount storageAccount = CloudStorageAccount.Parse("BlobEndpoint=<url>;AccountKey=<accountKey>"); 

      CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

      CloudBlobContainer container = blobClient.GetContainerReference("products"); 

      BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); 
      containerPermissions.PublicAccess = BlobContainerPublicAccessType.Off; 

      container.SetPermissions(containerPermissions); 

      containerPermissions.SharedAccessPolicies.Add("mypolicy", new SharedAccessPolicy() 
      { 
       SharedAccessStartTime = DateTime.UtcNow.AddSeconds(1), 
       SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1), 
       Permissions = SharedAccessPermissions.Read | SharedAccessPermissions.Write 
      }); 

      string sas = container.GetSharedAccessSignature(new SharedAccessPolicy(), "mypolicy"); 

      CloudBlobClient sasBlobClient = new CloudBlobClient(storageAccount.BlobEndpoint, new StorageCredentialsSharedAccessSignature(sas)); 

      CloudBlob blob = sasBlobClient.GetBlobReference("products/virtual/computer/brochure.pdf"); 

      Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

     } 
    } 

當我運行的代碼和URL粘貼到瀏覽器中,我得到以下幾點:

<?xml version="1.0" encoding="UTF-8"?> 
<Error> 
    <Code>AuthenticationFailed</Code> 
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:05c9cfc0-d7fd-4352-9b21-9e273efdc09f Time:2014-02-05T13:36:05.6126781Z</Message> 
    <AuthenticationErrorDetail>Signature did not match. String to sign used was /portalvhdsv53d88583slg1/products mypolicy</AuthenticationErrorDetail> 
</Error> 

我要的是生成,這將使我訪問PDF一段網址的時間爲blob存儲中的項目。我究竟做錯了什麼?

+0

能否請您編輯您的問題,並刪除該帳戶的關鍵。另外,我會建議重新生成帳戶密鑰。 –

+0

關鍵是沒有真正的鑰匙,這是一個假的。爲什麼重新生成密鑰? –

+0

我認爲這是一個真正的關鍵,因此評論。重新生成是因爲有人可以查看修訂歷史記錄並使用它們。考慮到關鍵不是真實的,這個問題是沒有意義的。對不起按緊急按鈕:) –

回答

0

根據您的代碼,權限策略在創建後1秒後有效。

SharedAccessStartTime = DateTime.UtcNow.AddSeconds(1), 
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1), 

所以你必須等待至少1秒後創建才能訪問。

試試這個insetead:

SharedAccessStartTime = DateTime.UtcNow(), 
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1), 

在這種情況下,政策是積極立刻

相關問題