C# SharedAccessSignature在客户端使用时不起作用
我正面临一个棘手的问题 我想允许某些用户从Azure容器读/写文件。为此,我使用了SharedAccessSignature的概念 我正在RESTFUL(ASP.NET MVC4)web服务中生成共享访问签名,客户端调用该web服务来获取访问密钥C# SharedAccessSignature在客户端使用时不起作用,c#,azure,C#,Azure,我正面临一个棘手的问题 我想允许某些用户从Azure容器读/写文件。为此,我使用了SharedAccessSignature的概念 我正在RESTFUL(ASP.NET MVC4)web服务中生成共享访问签名,客户端调用该web服务来获取访问密钥 CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount; CloudBlobClient blobClient = storageAc
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”)}上执行此操作代码>现在可以正常工作了。谢谢你的指导