我正在尝试直接从浏览器使用SAS密钥上传,因为要上传的文件可能非常大(500MB-1GB +),我不希望它们通过我们在Azure上托管的后端。< / p>
我正在关注this great post here但我现在遇到了CORS问题而另一方遇到了403错误。
CORS错误
请求时没有'Access-Control-Allow-Origin'标头 资源。因此不允许来源“http://localhost:36923” 访问。响应的HTTP状态代码为403。
正如您所看到的,我正在尝试让我的ASP MVC应用程序在本地运行,以便上传到Azure进行测试。
收到403错误:
403服务器无法验证请求。确保价值 正确形成授权标头,包括签名。
我生成SAS URI(明年到期且具有写访问权限)的方式如下:
// First I create the blob container
public static CloudBlockBlob CreateBlobContainer(string strContainer)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"].ToString());
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(strContainer);
container.CreateIfNotExists();
CloudBlockBlob blockBlob = new CloudBlockBlob(container.Uri, new StorageCredentials(ConfigurationManager.AppSettings["AccountName"], ConfigurationManager.AppSettings["AccountKey"]));
return blockBlob;
}
//Then I create a SAS key for that container
public static string GetSaSForBlobContainer(CloudBlockBlob blob, SharedAccessBlobPermissions permission)
var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
Permissions = permission,
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime = DateTime.UtcNow.AddYears(1),
});
return string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas);
}
//Above methods invoked as such
container = FileManager.CreateBlobContainer("supercontainer");
var sasUri = FileManager.GetSaSForBlobContainer(container, SharedAccessBlobPermissions.Write);
所以我创建了一个容器,然后生成一个允许上传一年左右的URI。
上面的sasUri
最终会在ASP MVC视图中公开,可以通过javascript逻辑访问。这是上面引用的博文的baseUrl
。
这是我容器上的CORS设置:
为什么我会收到此CORS错误?另外,为什么关于授权标题的错误?
我认为使用SAS URI的想法是不必向客户端公开帐户名/密钥。
我错过了什么吗?
答案 0 :(得分:3)
您链接的博客文章假定在blob容器上创建共享访问签名而不是blob,因为您事先并不知道用户要上传的文件的名称。但是,在您的代码中,您需要在Blob上创建SAS而不是blob容器,这就是您收到403错误的原因。
要解决此问题,请更改您的CreateBlobContainer
方法,并让其返回CloudBlobContainer
类型的对象,而不是CloudBlockBlob
。然后,请更新您的GetSaSForBlobContainer
并获得CloudBlobContainer
类型的第一个参数,而不是CloudBlockBlob
。完成这些更改后,您不应该收到403错误。