C# SharedAccessSignature在客户端使用时不起作用

C# SharedAccessSignature在客户端使用时不起作用,c#,azure,C#,Azure,我正面临一个棘手的问题 我想允许某些用户从Azure容器读/写文件。为此,我使用了SharedAccessSignature的概念 我正在RESTFUL(ASP.NET MVC4)web服务中生成共享访问签名,客户端调用该web服务来获取访问密钥 CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount; CloudBlobClient blobClient = storageAc

我正面临一个棘手的问题

我想允许某些用户从Azure容器读/写文件。为此,我使用了SharedAccessSignature的概念

我正在RESTFUL(ASP.NET MVC4)web服务中生成共享访问签名,客户端调用该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");
在最后一行,客户端抛出异常

服务器验证请求失败。确保授权标头的值格式正确,包括签名。

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


有趣的是,如果我在获取
sas
(string sas=container.GetShare……)
之后正确地放置客户端代码,它将毫无例外地工作。但是,如果我将客户机代码放在一个单独的控制台应用程序中(然后通过REST调用检索密钥),它会抛出异常。

我在控制台应用程序中测试了您的代码,它工作正常(我将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%2BH1ATVGGR7VF3GBWWQ84GV%2BZFbXRhOA%3D

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

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

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

var correctSAS = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(sas);
var correctSAS=Newtonsoft.Json.JsonConvert.DeserializeObject(sas);

您能否解释以下语句(最后一段):“…(然后通过REST调用检索密钥)”。Thx.He(Haris)可能意味着他通过对他的Web API进行REST调用来获得控制台应用程序中的共享访问密钥。是的,帕格是对的。。我的控制台应用程序调用REST API以获取密钥。如果代码在服务器上工作,但在客户端不工作,则可能是SAS字符串在两者之间没有正确通信。尝试在这两个地方记录它,以查看它被修改的位置。由于某种原因,当我在客户端尝试您的解决方案时,仍然会得到相同的异常。所以我决定在服务器
returnnewhttpresponsemessage{Content=newstringcontent(sasKey,System.Text.Encoding.UTF8,“application/json”)}上执行此操作现在可以正常工作了。谢谢你的指导