2013-03-24 53 views
1

我試圖在winrt中使用azure存儲。由於azure存儲客戶端與winrt不兼容,我正在嘗試使用azure的rest API。我有一段時間得到簽名的權利,我可以用另一雙眼睛來幫助我看到我要出錯的地方。在Restrt中使用Azure與Rest API,簽名時遇到問題

Azure帳戶提供了一個名稱和關鍵屬性,此方法立即建立請求,只需列出所有的blob。

'private async void BuildHTTPRequest(AzureAccount account) { System.Net.Http.HttpClient request = new HttpClient();

request.BaseAddress = new Uri(string.Format("http://{0}.blob.core.windows.net/", account.Name)); 

    // Always have to use UTC date/time 
    request.DefaultRequestHeaders.Add("x-ms-date", DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture)); 

    string fmtStringToSign = "{0}\n{1}\n{2}\n{3:R}\n{4}{5}"; 

    request.DefaultRequestHeaders.Add("x-ms-version", "2011-08-18"); 

    string hdr = CanonicalizeHeaders(request.DefaultRequestHeaders); 
    string authValue = string.Format(fmtStringToSign, "GET", "", "", "", hdr, ""); 
    byte[] signatureByteForm = System.Text.Encoding.UTF8.GetBytes(authValue); 



    string hashKey = account.Key; 

    MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA256"); 
    BinaryStringEncoding encoding = BinaryStringEncoding.Utf8; 
    var messageBuffer = CryptographicBuffer.ConvertStringToBinary(authValue, encoding); 
    IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(hashKey, encoding); 
    CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer); 
    IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer); 

    string hashedString = CryptographicBuffer.EncodeToBase64String(signedMessage); 

    String authHeader = String.Format(CultureInfo.InvariantCulture, "{0} {1}:{2}", "SharedKey", 
    account.Name, hashedString); 

    request.DefaultRequestHeaders.Add("Authorization", authHeader); 

    // Send the request to the queue 
    try 
    { 
     var test1 = request.GetAsync("?comp=list").Result; 
     if (test1.IsSuccessStatusCode) 
     { 

     } 
    } 
    catch (WebException ex) { } 


} 

這應該設置頁眉彌補簽約...

public string CanonicalizeHeaders(System.Net.Http.Headers.HttpRequestHeaders hdrCollection) 
{ 
    StringBuilder retVal = new StringBuilder();// Look for header names that start with "x-ms-" // Then sort them in case-insensitive manner. 

    List<string> httpStorageHeaderNameArray = new List<string>(); 
    Dictionary<string, string> ht = new Dictionary<string, string>(); 

    foreach (var key in hdrCollection) 
    { 
     if (key.Key.ToLowerInvariant().StartsWith("x-ms-", StringComparison.Ordinal)) 
     { 
      if (ht.ContainsKey(key.Key.ToLowerInvariant())) 
      { 
       ht[key.Key.ToLowerInvariant()] = string.Format("{0},{1}", ht[key.Key.ToLowerInvariant()], 
        hdrCollection.FirstOrDefault(m => m.Key == key.Key).ToString().Replace("\n", string.Empty).Replace("\r", string.Empty).Trim()); 
      } 
      else 
      { 
       httpStorageHeaderNameArray.Add(key.Key.ToLowerInvariant()); 
       ht.Add(key.Key.ToLowerInvariant(), 
       hdrCollection.FirstOrDefault(m => m.Key == key.Key).Value.FirstOrDefault().ToString().Replace("\n", string.Empty).Replace("\r", string.Empty).Trim()); 
      } 
     } 
    } 

    httpStorageHeaderNameArray.Sort();// Now go through each header's values in the sorted order and append them to the canonicalized string. 
    foreach (string key in httpStorageHeaderNameArray) 
    { 
     retVal.AppendFormat("{0}:{1}\n", key.Trim(), ht[key]); 
    } 
    return retVal.ToString(); 
} 

'

回答

2

最新的存儲客戶端庫的版本支持WinRT的。你可以在這裏閱讀更多關於它的信息:http://blogs.msdn.com/b/windowsazurestorage/archive/2012/10/29/introducing-windows-azure-storage-client-library-2-0-for-net-and-windows-runtime.aspx。我所做的是從Github下載源代碼:https://github.com/WindowsAzure/azure-sdk-for-net,在VS 2012中打開解決方案並構建RT項目以獲取必需的winmd文件。

來到你的問題,我相信你遇到這個問題,因爲你傳遞一個空字符串規範化的資源字符串:

string authValue = string.Format(fmtStringToSign, "GET", "", "", "", hdr, "") 

請參閱關於創建規範化的資源字符串此鏈接查看更多細節:http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx

+0

你是我的英雄。我真的不確定資源字符串應該是什麼。真的,雖然winrt支持的提示是我想要的:)它將節省大量的工作。謝謝! – 2013-03-24 22:10:12

相關問題