使用SAS密钥直接从客户端上载到Azure存储

时间:2017-07-26 13:29:12

标签: javascript c# azure azure-storage

我正在尝试直接从浏览器使用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

为什么我会收到此CORS错误?另外,为什么关于授权标题的错误?

我认为使用SAS URI的想法是不必向客户端公开帐户名/密钥。

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

您链接的博客文章假定在blob容器上创建共享访问签名而不是blob,因为您事先并不知道用户要上传的文件的名称。但是,在您的代码中,您需要在Blob上创建SAS而不是blob容器,这就是您收到403错误的原因。

要解决此问题,请更改您的CreateBlobContainer方法,并让其返回CloudBlobContainer类型的对象,而不是CloudBlockBlob。然后,请更新您的GetSaSForBlobContainer并获得CloudBlobContainer类型的第一个参数,而不是CloudBlockBlob。完成这些更改后,您不应该收到403错误。