如何生成Azure Content签名,将Content-Length标头限制为特定值?

时间:2016-02-01 14:39:24

标签: c# azure-storage-blobs azure-sdk-.net

我目前正在将ajax浏览器直接上传到azure存储容器中。首先,我需要一个签名的URL,这样我就可以在不与浏览器共享私钥的情况下这样做(我在上一次ajax调用时向我的服务器询问这个签名的URL)。

我的服务器端代码如下所示;

public string GetSignature(string fileName, int contentLength)
{
    CloudBlobContainer blobContainer = this.BlobClient.GetContainerReference("demo");

    CloudBlockBlob blob = blobContainer.GetBlockBlobReference("photo1.jpg");

    SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy()
    {
        Permissions = SharedAccessBlobPermissions.Create,
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10)
    };

    SharedAccessBlobHeaders headers = new SharedAccessBlobHeaders()
    {
        CacheControl = "",
        ContentDisposition = "",
        ContentEncoding = "",
        ContentLanguage = "",
        ContentType = ""
        // PROBLEM: Where's content length?
    };

    return blob.GetSharedAccessSignature(policy, headers);            
}

我的问题是我找不到指定内容长度标头的方法。我需要这样做以防止用户在拥有必须遵守的存储报价后上传大文件。

我已经google了很多,实际上找到了一种方法来实现这个按照this link实现签名算法的方法,但是实现所有这些本身只是我最后的选择(它会更容易出错并且时间更长消耗)。

所以我的问题是,有没有办法将内容长度约束传递给PUT签名的网址?

1 个答案:

答案 0 :(得分:2)

目前无法对委派访问设置blob大小限制。 (您提供的链接用于使用帐户密钥签署请求;它不会限制正在上传的Blob的大小。)

有两个因素会限制此方案中上传的数据量:

  1. SAS令牌的时间限制。您的代码显示10分钟的窗口;假设60 MB /秒允许大约36 GB。
  2. 单个blob的最大大小是一个硬上限。
  3. 一种解决方案是定期扫描容器并清理超出用户配额的任何blob。

    作为一个侧面点,SharedAccessBlobHeaders控制用户下载blob时看到的内容。它们不限制用户可以上传的内容,因此它们与您的方案无关。您只需为此参数传入null。