1

我面临一个有线问题..

我想允许某些用户从/向 Azure-Container 读取/写入文件。为此,我使用了 SharedAccessSignature 的概念。

我在客户端调用以获取访问密钥的 RESTFUL (ASP.NET MVC4) Web 服务中生成共享访问签名..

  CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
  CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient ();
  CloudBlobContainer container = blobClient.GetContainerReference (containerName);
  container.CreateIfNotExist ();
  BlobContainerPermissions containerPermissions = new BlobContainerPermissions ();
  containerPermissions.PublicAccess = BlobContainerPublicAccessType.Off;
  container.SetPermissions (containerPermissions);
  string sas = container.GetSharedAccessSignature (new SharedAccessPolicy ()
        {
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes (30),
            Permissions = SharedAccessPermissions.Write | SharedAccessPermissions.Read
        });
  //return sas to user

我返回sas客户端,他尝试使用以下代码上传 blob

  CloudBlobClient sasBlobClient = new CloudBlobClient ("http://127.0.0.1:10000/devstoreaccount1", new StorageCredentialsSharedAccessSignature (sak));
  CloudBlob blob = sasBlobClient.GetBlobReference (containerName + "/myblob.txt");
  blob.UploadText ("Hello SAS World");

在最后一行客户端抛出异常

服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名。

内部异常:{“远程服务器返回错误:(403)禁止。”}

有趣的部分是,如果我在得到sas (string sas = container.GetShare....... )它之后立即放置客户端代码,没有任何例外。但是,如果我将客户端代码放在单独的控制台应用程序中(然后通过 REST 调用检索密钥),它会引发异常。

4

1 回答 1

2

我在控制台应用程序中测试了您的代码,它工作正常(我将 sas 变量传递给 CloudBlobClient)。但后来我使用 ASP.NET Web API 设置了一个 REST 服务,并使用 WebClient 检索了密钥:

  WebClient wc = new WebClient();
  var sas = wc.DownloadString("http://127.0.0.1:47413/api/values/1");

在 Web 应用程序和控制台应用程序中,我使用 Trace 将 SAS 密钥写入了输出窗口,结果如下:

网络应用程序:?se=2012-08-02T19%3A54%3A53Z&sr=c&sp=rw&sig=oWEF7r5HpkEh%2BH1aTVKGR7VF3gbWwq84gv%2BZFbXRhOA%3D

客户端:“?se=2012-08-02T19%3A54%3A53Z&sr=c&sp=rw&sig=oWEF7r5HpkEh%2BH1aTVKGR7VF3gbWwq84gv%2BZFbXRhOA%3D”

如您所见,SAS 密钥似乎用双引号括起来。我不知道您使用什么来创建 REST 服务,但我使用的是 ASP.NET Web API。在这里它使用 JSON 格式化程序作为默认格式化程序。所以返回的 SAS 密钥是正确的,唯一的问题是它是以 JSON 格式返回的。

要获得实际的 SAS 密钥,您需要将其反序列化为字符串(听起来很奇怪,不是吗?),这是 Json.NET 的示例:

var correctSAS = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(sas);
于 2012-08-02T19:35:33.250 回答