2017-10-25 1 views
0

내 인증 코드는 내가 잘못했을 수 있습니다.
나는 내 코드
Blob 저장소에서 파일 다운로드를위한 인증 서명 코드가 필요합니다. 나머지 API 사용

개인 const를 문자열 FileDownloadURL = "은 https : // {0} .blob.core.windows.net/{1}/{2}"를 참조하십시오 연결;

public async Task<string> DownloaDFileToBlob(string blobname, string downloadpath, string filename) 
     { 

      string Requesturl = string.Format(FileDownloadURL, storageAccount, blobname, filename); 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Requesturl); 
      string now = DateTime.UtcNow.ToString("R"); 
      string exp = DateTime.UtcNow.AddDays(1).ToString("R"); 
      request.Method = "GET"; 
      request.Headers.Add("x-ms-version", "2015-12-11"); 
      request.Headers.Add("x-ms-date", now); 
      request.Headers.Add("x-ms-blob-type", "BlockBlob"); 
      request.Headers.Add("Authorization", AuthorizationHeader3(now, exp,storageAccount, blobname, filename)); 
      var response = await request.GetResponseAsync(); 

      using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) 
      { 
       return resp.StatusCode.ToString(); 
      } 

     } 

내 인증 헤더 Get blob API

https://myaccount.blob.core.windows.net/mycontainer/myblob 

canonicalizedResource 말아야에 따르면 방법

private string AuthorizationHeader3(string method, string now, HttpWebRequest request, string storageAccount, string storageKey, string containerName,string filename) 
     { 

      string headerResource = $"x-ms-date:{now}\nx-ms-version:2015-12-11"; 
      string canonicalizedResource = $"/{storageAccount}/{containerName}/{filename}\ncomp:metadata\nrestype:container\ntimeout:20"; 
      var contentEncoding = ""; 
      var contentLanguage = ""; 
      var contentLength = ""; 
      var contentMd5 = ""; 
      var contentType = ""; 
      var date = ""; 
      var ifModifiedSince = ""; 
      var ifMatch = ""; 
      var ifNoneMatch = ""; 
      var ifUnmodifiedSince = ""; 
      var range = ""; 
      var stringToSign = $"{method}\n{contentEncoding}\n{contentLanguage}\n{contentLength}\n{contentMd5}\n{contentType}\n{date}\n{ifModifiedSince}\n{ifMatch}\n{ifNoneMatch}\n{ifUnmodifiedSince}\n{range}\n{headerResource}\n{canonicalizedResource}"; 
      var signature = ""; 
      using (var hmacSha256 = new HMACSHA256(Convert.FromBase64String(storageKey))) 
      { 
       var dataToHmac = Encoding.UTF8.GetBytes(stringToSign); 
       signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac)); 
      } 
      String AuthorizationHeader = String.Format("{0} {1}:{2}", "SharedKey", storageAccount, signature); 
      return AuthorizationHeader; 
     } 
+0

당신은 스토리지 SDK를 사용할 수 있습니다. – juunas

+0

@ 주니어하지만 나머지 API가 필요합니다. 즉, 내가 묻는 이유 – Ramprasathselvam

+0

SDK에서 지원하지 않는 REST API에서 어떤 기능을 사용하려고합니까? – juunas

답변

1

추가 $"/{storageAccount}/{containerName}/{blobName}하지

$"/{storageAccount}/{containerName}/{filename}\ncomp:metadata\nrestype:container\ntimeout:20"; 

이 덩어리를 다운로드하려면 다음 데모 코드를 사용하는 시도가주세요 거라고. 그것은 내 편이 제대로 작동합니다. https://www.nuget.org/packages/WindowsAzure.Storage/ :

var account = "storageAccount"; 
var accountKey = "account key"; 
var container = "container name"; 
var blobName = "blob name"; 
var apiVersion = "2015-12-11"; 
var blobUrl = $"https://{account}.blob.core.windows.net/{container}/{blobName}"; 
var method = "GET"; 
var now = DateTime.UtcNow.ToString("R"); 
var canonicalizedHeaders = $"x-ms-date:{now}\nx-ms-version:{apiVersion }"; 
var canonicalizedResource = $"/{account}/{container}/{blobName}"; 
var stringToSign = $"{method}\n\n\n\n\n\n\n\n\n\n\n\n{canonicalizedHeaders}\n{canonicalizedResource}"; 
var auth = CreateAuthString(account, stringToSign, accountKey); 

Uri uri = new Uri(blobUrl); 
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri); 
HttpClient client = new HttpClient(); 
client.DefaultRequestHeaders.Add("x-ms-date", now); 
client.DefaultRequestHeaders.Add("x-ms-version", "2015-12-11"); 
client.DefaultRequestHeaders.Add("Authorization", auth); 
HttpResponseMessage response = client.SendAsync(request).Result; 
var status = response.IsSuccessStatusCode; 



private static string CreateAuthString(string blobStorageAccount, string signStr, string blobStorageAccessKey) 
    { 
      string signature; 
      byte[] unicodeKey = Convert.FromBase64String(blobStorageAccessKey); 
      using (HMACSHA256 hmacSha256 = new HMACSHA256(unicodeKey)) 
      { 
       byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(signStr); 
       signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac)); 
      } 

      var authorizationHeader = String.Format(
       CultureInfo.InvariantCulture, 
       "{0} {1}:{2}", 
       "SharedKey", 
       blobStorageAccount, 
       signature); 

      return authorizationHeader; 
     } 

enter image description here

+0

고맙습니다. @TomSun. 제대로 작동합니다. – Ramprasathselvam

관련 문제