2012-08-02 67 views
1

用我面臨的一個問題,有線不工作時..SharedAccessSignature在客戶端

我想允許特定用戶從/到Azure的集裝箱讀/寫文件。爲此,我使用SharedAccessSignature的概念。

我生成在RESTful(ASP.NET MVC4)Web服務哪些客戶端調用以獲得進入關鍵的共享訪問簽名..

CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount; 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer container = blobClient.GetContainerReference (containerName); 
    container.CreateIfNotExist(); 
    BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); 
    containerPermissions.PublicAccess = BlobContainerPublicAccessType.Off; 
    container.SetPermissions (containerPermissions); 
    string sas = container.GetSharedAccessSignature (new SharedAccessPolicy() 
     { 
      SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes (30), 
      Permissions = SharedAccessPermissions.Write | SharedAccessPermissions.Read 
     }); 
    //return sas to user 

我回到sas在那裏他試圖上傳客戶端最後行客戶端上的斑點使用下面的代碼

CloudBlobClient sasBlobClient = new CloudBlobClient ("http://127.0.0.1:10000/devstoreaccount1", new StorageCredentialsSharedAccessSignature (sak)); 
    CloudBlob blob = sasBlobClient.GetBlobReference (containerName + "/myblob.txt"); 
    blob.UploadText ("Hello SAS World"); 

拋出異常

服務器無法authenti滿足要求。確保授權標頭的值正確形成,包括簽名。

內部異常:{「遠程服務器返回錯誤:禁止(403)」}

有趣的是,如果我把客戶端代碼獲得sas(string sas = container.GetShare.......)它工作沒有任何之後例外。但是,如果我將我的客戶端代碼放入單獨的控制檯應用程序(然後通過REST調用檢索密鑰),則會引發異常。

+1

你能解釋一下下面的語句(最後段落):「...(然後通過REST調用檢索密鑰)...」。謝謝。 – 2012-08-02 13:03:33

+1

他(Haris)可能意味着他通過對其Web API進行REST調用來獲取控制檯應用程序中的共享訪問密鑰。 – pug 2012-08-02 14:41:25

+0

是的帕格是正確的..我的控制檯應用程序調用REST API以獲得密鑰 – 2012-08-02 15:05:42

回答

2

我在控制檯應用程序中測試了你的代碼,它工作正常(我將sas變量傳遞給了CloudBlobClient)。但後來我設置了使用ASP.NET Web API REST服務,並使用Web客戶端檢索到的關鍵:

WebClient wc = new WebClient(); 
    var sas = wc.DownloadString("http://127.0.0.1:47413/api/values/1"); 

在Web應用程序和控制檯應用程序使用我寫了跟蹤的SAS鑰匙到我的輸出窗口都,結果如下:

WebApp: ?se=2012-08-02T19%3A54%3A53Z&sr=c&sp=rw&sig=oWEF7r5HpkEh%2BH1aTVKGR7VF3gbWwq84gv%2BZFbXRhOA%3D

Client: "?se=2012-08-02T19%3A54%3A53Z&sr=c&sp=rw&sig=oWEF7r5HpkEh%2BH1aTVKGR7VF3gbWwq84gv%2BZFbXRhOA%3D"

正如您所看到的,它看起來像SAS密鑰是用雙引號括起來的。我不知道你用什麼來創建你的REST服務,但我正在使用ASP.NET Web API。在這裏它使用JSON格式化程序作爲默認格式化程序。所以返回的SAS密鑰是正確的,唯一的問題是它以JSON格式返回。

獲得實際的SAS鍵,你就需要將其反序列化到一個字符串(聽起來不可思議不是嗎?),這裏是Json.NET一個例子:

var correctSAS = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(sas); 
+0

由於某種原因,當我在客戶端嘗試解決方案時,我仍然得到相同的異常。所以我決定在服務器上做這個 'return new HttpResponseMessage { Content = new StringContent(sasKey,System.Text.Encoding.UTF8,「application/json」) };'現在工作正常。感謝您的指導 – 2012-08-03 05:25:27