azure - 我需要授权签名代码才能从 Blob 存储下载文件。使用 Rest API

标签 azure azure-storage azure-blob-storage

我的身份验证代码可能是错误的。
我附上了我的代码,请引用

private const string 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();
            }

        }

My Authentication Header add method

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;
        }

最佳答案

根据Get blob API

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

canonicalizedResource 应该是 $"/{storageAccount}/{containerName}/{blobName} 不是

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

请尝试使用以下演示代码来下载 blob。它在我这边工作正常。

 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

关于azure - 我需要授权签名代码才能从 Blob 存储下载文件。使用 Rest API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46933126/

相关文章:

azure - SQL Data Sync Agent 2.0 安装错误系统服务

c# - 能否使用 Azure 数据工厂在 Azure Blob 中生成 CSV

azure - 如何将 blob 从 Azure 存储下载到浏览器。使用 ASP.NET MVC 4.8

angular - 如何使用 v10 SDK 将图像上传到 Azure Blob 存储?

azure - Azure 上 Suave 中的 SqlDataProvider 连接字符串

python - Azure Cosmos DB Python SDK : How to read change feed?

c# - CloudBlobContainer.ListBlobs() 中如何使用前缀参数从 Azure Blob 存储中的虚拟文件夹获取文件

azure - 如何使用 Azure Data Lake Storage Gen2 和 Azure Data Factory V2 执行基于事件的数据引入?

sql-server - 从 Azure Blob 存储读取文件到 Azure SQL 数据库

php - 使用 php 通过 azure-website 连接到 azure-blob