【问题标题】:Shared Access Signature to manipulate Azure blob container用于操作 Azure blob 容器的共享访问签名
【发布时间】:2018-09-02 23:01:43
【问题描述】:

我想将 SAS uris 提供给其他应用程序,以允许它们将文件发送到 blob 容器。但是,尝试上传文件时代码失败,给我一个异常,指出:

服务器未能验证请求。确保 Authorization 标头的值格式正确,包括签名。

我正在使用 aspnetcore 和 WindowsAzure.Storage 版本 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));

【问题讨论】:

    标签: azure azure-storage


    【解决方案1】:

    基本上问题是您的Shared Access Signature (SAS) 缺少Expiry Date 即SAS 到期的日期/时间。

    当我运行你的代码时,我得到了同样的错误。但是当我通过 Fiddler 跟踪请求/响应时,这是 Storage Service 发回的:

    <?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");
    

    【讨论】:

    • 谢谢,这让我发疯了。没想到运行 fiddler 来查看请求。
    • Fiddler 在任何情况下都是你最好的朋友 :)。您可以立即获得有关操作的大量信息,并且在 Storage SDK 不直接公开错误详细信息时尤其有用(您必须深入挖掘 SDK 才能找到这些信息)。
    猜你喜欢
    • 2013-12-31
    • 2014-02-08
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2017-08-24
    • 2018-08-17
    相关资源
    最近更新 更多