Azure v2 GetResponse验证失败.错误403:Forbidden
本文关键字:Forbidden 错误 失败 v2 GetResponse 验证 Azure | 更新日期: 2023-09-27 17:54:57
我正在将Windows Azure从1.7迁移到版本2,我现在面临着旧身份验证方式的一些问题。当我尝试执行下一个代码时(使用Azure SDK的旧实现)…
[...]
var policy = new SharedAccessBlobPolicy();
policy.SharedAccessStartTime = new DateTimeOffset(DateTime.UtcNow.AddMinutes(-5));
policy.SharedAccessExpiryTime = policy.SharedAccessStartTime.Value.AddMinutes(5);
policy.Permissions = SharedAccessBlobPermissions.Read;
var sas = blobContainer.GetSharedAccessSignature(policy)
var request = WebRequest.Create(string.Format("{0}/{1}{2}", containerUri, blobName, sas));
request.Method = "GET";
var headers = new NameValueCollection();
headers.Add("x-ms-blob-type", "BlockBlob");
request.Headers.Add(headers);
request.ContentLength = 0;
var response = (HttpWebResponse)request.GetResponse();
[...]
…GetResponse()方法对我很生气,并抛出一个WebException,说"服务器未能验证请求"。"
ResponseUri是http://127.0.0.1:10000/devstoreaccount1/testcontainer/testBlob?sv=2012-02-12&st=2013-01-22T09.52.27Z&se=2013-01-22T09.57.29Z&sr=c&sp=r&sig=WxFfIg9NxKodH7zGjKRym7RuXd61F5jlG6ILtG1UYPg%3D
,对我来说它看起来很好。我认为这是AccountKey的问题,但在使用Azure门户提供的正确密钥在真实存储上尝试时,我也遇到了同样的问题。
是否有任何属性或新的初始化来完成新的REST API?
UPDATE:我已经尝试了@Gaurav Mantri在他的回复中开发的控制台应用程序,但它仍然不适合我。所以,我怀疑这个问题可能取决于我的机器上的意大利语本地化,或者与Windows 8相关的一些事情(在另一个同事的机器上,控制台应用程序不能很好地工作,出现同样的错误403,禁止!由GetResponse
抛出)。我注意到我们得到的URI不同于我在网上找到的每一个例子,所以我看到开始和到期时间为(例如)2013-01-22T09.52.27Z
而不是2013-01-22T09%3A52%3A27Z
好的,我找到问题所在了。
将Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
行添加到我的代码(或测试初始化器)将解决这个问题。
看着WindowsAzure。存储源,当服务创建签名时,它使用格式字符串"yyyy-MM-ddTHH:mm:ssZ",而不将CultureInfo.InvariantCulture
作为参数传递给ToString
方法。但在意大利的地区设置中,小时、分和秒之间的分隔符是点,而在美国是两点。所以我的本地机器和远程机器创建了两个不同的签名,它们无法匹配。
我将把这个报告为bug(或问题),因为不是每个人都有相同的区域设置。
对于GET操作,您不需要添加"x-ms-blob-type"请求头。只有在上传blob时才需要。请删除以下代码行后再试一次:
var headers = new NameValueCollection();
headers.Add("x-ms-blob-type", "BlockBlob");
request.Headers.Add(headers);
更新:下面是使用SAS URI读取blob的完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using System.Net;
using System.IO;
namespace ConsoleApplication26
{
class Program
{
static void Main(string[] args)
{
CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
CloudBlobContainer blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference("temp");
//Create blob container.
blobContainer.CreateIfNotExists();
string blobContents = "Let's test SAS out :)";
byte[] bytes = Encoding.UTF8.GetBytes(blobContents);
string blobName = "sastest.txt";
CloudBlockBlob blob = blobContainer.GetBlockBlobReference(blobName);
//Upload blob
using (MemoryStream ms = new MemoryStream(bytes))
{
blob.UploadFromStream(ms);
}
//Get SAS Uri
var sasUri = GetSasUrl(blobContainer, blobName);
DownloadBlob(sasUri);
Console.ReadLine();
}
static Uri GetSasUrl(CloudBlobContainer blobContainer, string blobName)
{
var policy = new SharedAccessBlobPolicy()
{
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5),
Permissions = SharedAccessBlobPermissions.Read,
};
var sas = blobContainer.GetSharedAccessSignature(policy);
return new Uri(string.Format("{0}/{1}{2}", blobContainer.Uri, blobName, sas));
}
static void DownloadBlob(Uri sasUri)
{
var request = (HttpWebRequest)WebRequest.Create(sasUri);
request.Method = "GET";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
long responseContentLength = response.ContentLength;
byte[] fetchedContents = new byte[(int) responseContentLength];
using (var stream = response.GetResponseStream())
{
stream.Read(fetchedContents, 0, fetchedContents.Length);
}
string blobContents = Encoding.UTF8.GetString(fetchedContents);
Console.WriteLine("Blob Contents: " + blobContents);
}
}
}
}
我在尝试上传文件时遇到了同样的错误。我做了一些搜索,没有一个建议的解决方案是有效的。
然后我检查了内部异常中的http响应对象,发现我不小心使用不是文件名而是完整的文件路径(c:'folder'folder'file.jpg而不仅仅是file.jpg)创建了blob,因此它试图上传的url不存在。