2015-02-06 61 views
0

我想我使用下面的代碼做上傳上傳BLOB天青 - 創建認證頭

var uploadurl = asset["BaseUri"].ToString() + "/tom.mp4" + asset["ContentAccessComponent"].ToString(); 

     var formcontent = new MultipartFormDataContent(); 

     FileStream stream = File.OpenRead(@"C:\tom.mp4"); 
     byte[] fileBytes = new byte[stream.Length]; 
     Int32 blobLength = fileBytes.Length; 
     stream.Read(fileBytes, 0, fileBytes.Length); 
     stream.Close(); 
     var streamcontent = new StreamContent(new MemoryStream(fileBytes)); 
     formcontent.Add(streamcontent, "tom.mp4", "tom.mp4"); 
     formcontent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 

     var date = DateTime.UtcNow.ToString("R", System.Globalization.CultureInfo.InvariantCulture); 
     string authorizationHeader = this.Create(date, "mediasvc01f17vpm97tcf", AssetUri.ToString()); 
     var container = AssetID.ToString(); 
     container = container.Replace("nb:cid:UUID:", "asset-"); 

     string auth = this.strTosign(
      date.ToString(CultureInfo.InvariantCulture), 
      "BlockBlob", 
      "2014-02-14", 
      blobLength.ToString(), 
      "mediasvc01f17vpm97tcf", 
      container, 
      "tom.mp4"); 

     client = new HttpClient(); 
     client.DefaultRequestHeaders.Add("Authorization", auth); 
     client.DefaultRequestHeaders.Add("x-ms-version", "2014-02-14"); 
     client.DefaultRequestHeaders.Add("x-ms-date", date); 
     client.DefaultRequestHeaders.Add("x-ms-blob-type", "BlockBlob"); 

但是我的認證是不正確的,我得到一個403到BLOB上傳到我的蔚藍媒體服務器。任何人都可以給我一個身份驗證頭的例子,用於將視頻blob上傳到資產。

請不要簡單地鏈接到微軟的文檔,如果我理解他們充分,我不會在這裏問:)

我想創建我的認證頭這樣

private string strTosign(string date,string blobType,string storageversion, string bloblength, string account, string assetname,string blobname) 
     { 
      var urlPath = String.Format("{0}/{1}", assetname, blobname); 

      String canonicalizedHeaders = String.Format(
      "x-ms-blob-type:{0}\nx-ms-date:{1}\nx-ms-version:{2}", 
      blobType, 
      date, 
      storageversion); 
      String canonicalizedResource = String.Format("/{0}/{1}", account, urlPath); 
      String stringToSign = String.Format(
        "{0}\n\n\n{1}\n\n\n\n\n\n\n\n\n{2}\n{3}", 
        "PUT", 
        bloblength, 
        canonicalizedHeaders, 
        canonicalizedResource); 
      return authhead(stringToSign,account); 
     } 

     private string authhead(string strignToSign, string _account) 
     { 
      var sharedKey = Convert.FromBase64String("secret_key"); 
var hasher = new HMACSHA256(sharedKey); 
      var convert = hasher.ComputeHash(Encoding.UTF8.GetBytes(strignToSign)); 
      string authorizationHeader = string.Format("SharedKey {0}:{1}", _account, Convert.ToBase64String(convert)); 
      return authorizationHeader; 
     } 

拳創建一個字符串跟在azure tutorial的例子後面,我做加密。但是我做錯了什麼,因爲它一直說認證是錯誤的格式。

我canonicalizedResource看起來像這樣/mediasvc01f17vpm97tcf/asset-09f20ee8-e100-42be-8d20-e921a8c8fdb2/tom.mp4 我canonicalizedHeaders這個樣子

x-ms-blob-type:BlockBlob 
x-ms-date:Fri, 06 Feb 2015 11:53:10 GMT 
x-ms-version:2014-02-14 

整個字符串加密前這個樣子的

PUT 
383631 
x-ms-blob-type:BlockBlob 
x-ms-date:Fri, 06 Feb 2015 11:53:10 GMT 
x-ms-version:2014-02-14 
/mediasvc01f17vpm97tcf/asset-09f20ee8-e100-42be-8d20-e921a8c8fdb2/tom.mp4 

而且整個事情結束了這樣

SharedKey mediasvc01f17vpm97tcf:l3fzhrHP3ab+Ae2uQDO8/4iZkN61umMFp8Dx+od+m/A= 

這是回答我回來

<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidAuthenticationInfo</Code><Message>Authentication information is not given in the correct format. Check the value of Authorization header. 
RequestId:67382196-0001-0027-0eb7-53bd86000000 
Time:2015-02-06T13:10:39.7486266Z</Message></Error> 
+0

我注意到的一件事是您使用DateTime.Now(第二代碼塊)。請改用DateTime.UtcNow。否則,計算你的驗證頭的代碼對我來說看起來很好。請分享上傳代碼(或者您是否使用了上面包含的相同代碼(您的問題中的第一個代碼塊))? – 2015-02-06 12:26:52

+0

非常感謝您的回覆。我已經更新了我現在嘗試上傳的代碼片段。但基本上我已經將它改爲utc,並且當然更新了標題中的授權。但我仍然得到相同的錯誤 – Bjarke 2015-02-06 12:55:40

+0

我注意到的另一件事是,你在請求​​中將'content-type'設置爲'application/octet-stream',但是當你創建'stringToSign'時它沒有被設置。 。這也可能導致授權標頭不匹配。請在你的stringToSign中包含內容類型。 – 2015-02-06 13:22:06

回答

1

我正在使用媒體服務器的azure服務,並且此流向我提供上傳url。這個URL不需要認證,這意味着當認證頭被移除時,它起到了魅力的作用。詭異的部分是當我提供了一個身份驗證頭只是給錯誤的格式錯誤,而不是說它不需要。

這可能是一個菜鳥的錯誤,但謝謝你的幫助。