在Windows Azure Storage Client中授权blob上载操作的正确方法是什么?

时间:2016-06-13 08:04:11

标签: c# azure azure-storage azure-storage-blobs

我需要创建一个库,允许我将blob数据上传到某个Azure帐户。以下参数将由外部Web服务动态提供:

x-ms-date, x-ms-version, Content-MD5, x-ms-blob-type, Content-Type, Authorization

根据这里的例子:

https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-1/

我应该能够通过URL和SasToken上传blob数据,例如:

Uri blobUri = new Uri("http://127.0.0.1:10000/devstoreaccount1/sascontainer/myblob.txt");

// Create credentials with the SAS token. The SAS token was created in previous example.
StorageCredentials credentials = new StorageCredentials(sasToken);

// Create a new blob.
CloudBlockBlob blob = new CloudBlockBlob(blobUri, credentials);

// Upload the blob.
// If the blob does not yet exist, it will be created.
// If the blob does exist, its existing content will be overwritten.
using (var fileStream = System.IO.File.OpenRead(@"c:\Temp\myblob.txt"))
{
    blob.UploadFromStream(fileStream);
}

但是,上面假设sasToken看起来与此相似:

?sv=2015-07-08&sr=c&si=mypolicy&sig=FQctgR3waFrWpblkNJf6HYXAVa0%2BkxFUbP8Fr2op%2F%2FI%3D

虽然我的服务只会提供:

{
    "Key": "Authorization",
    "Value": "SharedKey storageAccountName:Tz7EqAl6OszIxGjBUk2qcxs82Af4Xq9CxyFx6u34LEI="
}

我在这里找到了一些例子:

https://msdn.microsoft.com/en-us/library/azure/dd179451.aspx

关于如何使用REST API执行此操作:

Request Syntax:
PUT https://myaccount.blob.core.windows.net/mycontainer/myblockblob HTTP/1.1

Request Headers:
x-ms-version: 2015-02-21
x-ms-date: <date>
Content-Type: text/plain; charset=UTF-8
x-ms-blob-content-disposition: attachment; filename="fname.ext"
x-ms-blob-type: BlockBlob
x-ms-meta-m1: v1
x-ms-meta-m2: v2
Authorization: SharedKey myaccount:YhuFJjN4fAR8/AmBrqBz7MG2uFinQ4rkh4dscbj598g=
Content-Length: 11

Request Body:
hello world

但是,由于我是Azure的新手,我无法弄清楚如何使用存储客户端执行上述操作......我是否必须以某种方式手动操作&#34; map&#34;提供头参数来查询字符串参数还是有更好的/其他方式?或者Storage Client不支持这个,我应该使用REST方法吗?

EDIT1:

要明确:我 - 或多或少 - 知道如何使用sas令牌上传blob,只要它具有以下形式:

https://myaccount.blob.core.windows.net/mycontainer/myblockblob??sv=2015-07-08&sr=c&si=mypolicy&sig=FQctgR3waFrWpblkNJf6HYXAVa0%2BkxFUbP8Fr2op%2F%2FI%3D

问题是 - 不会提供此令牌 - 相反,我们尝试集成的网站将发布网络服务,此网络服务(我们无法控制) 将提供以下五个参数(以下示例数据):

{
  "Key": "x-ms-date",
  "Value": "Mon, 13 Jun 2016 10:22:05 GMT"
},
{
  "Key": "x-ms-version",
  "Value": "2015-04-05"
},
{
  "Key": "Content-MD5",
  "Value": "dnF5x6K/8ZZRzpfSlMMM+w=="
},
{
  "Key": "x-ms-blob-type",
  "Value": "BlockBlob"
},
{
  "Key": "Content-Type",
  "Value": "application/octet-stream"
},
{
  "Key": "Authorization",
  "Value": "SharedKey taxdocumentstorage09tst:sImBLJPWACNPzi94eJEDRU4Bt5hz9sPURjwy46KixmM="
}

2 个答案:

答案 0 :(得分:1)

  

但是因为我是Azure的新手,所以我无法弄清楚如何做到这一点   与存储客户端...我必须以某种方式手动“地图”提供   用于查询字符串参数的头参数或是否存在   更好/其他方式?或者Storage Client不支持此功能,   我应该使用REST方法吗?

您无法使用Storage Client库,因为它会计算其中一些参数,然后调用REST API。您需要做的是直接使用REST API。由于您获得了所需的所有值,因此您只需使用HttpWebRequest / WebClient进行REST API调用,包含必要的标头,发送请求并相应地处理响应。

重要

请让Web服务在其发送的参数中包含请求URL,因为它用于计算授权标题。

答案 1 :(得分:0)

您应该将SAS令牌附加到您的URL和标题&#34;授权&#34;这里不需要。例如:

PUT https://myaccount.blob.core.windows.net/mycontainer/myblockblob?sv=2015-07-08&sr=c&si=mypolicy&sig=FQctgR3waFrWpblkNJf6HYXAVa0%2BkxFUbP8Fr2op%2F%2FI%3D