代码之家  ›  专栏  ›  技术社区  ›  BennyM

用于操纵Azure blob容器的共享访问签名

  •  2
  • BennyM  · 技术社区  · 6 年前

    我希望将SAS URI提供给其他应用程序,以允许它们将文件发送到blob容器。但是,当尝试上载文件时,代码失败,导致出现异常,其中指出:

    服务器无法验证请求。确保包括签名在内的授权标头的值格式正确。

    我正在使用aspnetcore和WindowsAzure。存储版本9.1.0。

            var acc = CloudStorageAccount.Parse("mysecrets");
            CloudBlobClient client = acc.CreateCloudBlobClient();
            var container = client.GetContainerReference("myblobcontainer");
            await container.CreateIfNotExistsAsync();
            var permissions = container.GetPermissionsAsync().Result;
            permissions.SharedAccessPolicies.Add("writepolicy",
                new SharedAccessBlobPolicy
                {
                    Permissions =
                        SharedAccessBlobPermissions.Add |
                        SharedAccessBlobPermissions.Create |
                        SharedAccessBlobPermissions.List |
                        SharedAccessBlobPermissions.Write,
                });
            await container.SetPermissionsAsync(permissions);
            var sas = container.GetSharedAccessSignature(null, "writepolicy");
            var accessUri = container.Uri.ToString() + sas;
    
            var cloudBlobContainer = new CloudBlobContainer(new Uri(accessUri));
            var blob = cloudBlobContainer.GetBlockBlobReference("myfile.txt");
            await blob.UploadFromFileAsync("foo.txt");
    

    我也尝试过这样创建cloudBlobContainer:

    var cloudBlobContainer = 
                 new CloudBlobContainer(container.Uri, new StorageCredentials(sas));
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Gaurav Mantri    6 年前

    本质上,问题在于 Shared Access Signature (SAS) 缺少 Expiry Date i、 e.SAS到期的日期/时间。

    当我运行你的代码时,我遇到了同样的错误。但当我通过Fiddler跟踪请求/响应时,存储服务返回了以下内容:

    <?xml version="1.0" encoding="utf-8"?>
      <Error>
        <Code>AuthenticationFailed</Code>
        <Message>
          Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
          RequestId:320035be-801e-0040-6e5e-c30407000000
          Time:2018-03-24T10:57:38.7791868Z
        </Message>
        <AuthenticationErrorDetail>
          Signed expiry must be specified in signature or SAS identifier
        </AuthenticationErrorDetail>
      </Error>
    

    您需要做的是添加到期日期/时间。您可以添加到共享访问策略,也可以在创建SAS时指定此策略(但不能同时在两个位置)。

    请使用以下代码创建SAS:

        var policy = new SharedAccessBlobPolicy()
        {
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(15)
        };
        var sas = container.GetSharedAccessSignature(policy, "writepolicy");