【问题标题】:On Azure Storage, CanGenerateSasUri is always false在 Azure 存储上,CanGenerateSasUri 始终为 false
【发布时间】:2021-03-19 16:24:01
【问题描述】:

我有一个使用 Azure 存储的 ASP .Net Core 3.1 Web API。 为此,它使用了 Microsoft.Azure.Storage.Blob 库。 NuGet 包管理器通知我此包已弃用,我宁愿使用 Azure.Storage.Blobs。 我这样做了,并继续修复由于此更改而导致的所有损坏的代码。 在我点击为客户端生成共享访问签名 (SAS) 的代码之前,我没有遇到很多问题。 无论如何,我设法通过以下代码使其工作:

https://docs.microsoft.com/en-us/azure/storage/blobs/sas-service-create?tabs=dotnet

private static Uri GetServiceSasUriForContainer(BlobContainerClient containerClient,
                                          string storedPolicyName = null)
{
    // Check whether this BlobContainerClient object has been authorized with Shared Key.
    if (containerClient.CanGenerateSasUri)
    {
        // Create a SAS token that's valid for one hour.
        BlobSasBuilder sasBuilder = new BlobSasBuilder()
        {
            BlobContainerName = containerClient.Name,
            Resource = "c"
        };

        if (storedPolicyName == null)
        {
            sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
            sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
        }
        else
        {
            sasBuilder.Identifier = storedPolicyName;
        }

        Uri sasUri = containerClient.GenerateSasUri(sasBuilder);
        Console.WriteLine("SAS URI for blob container is: {0}", sasUri);
        Console.WriteLine();

        return sasUri;
    }
    else
    {
        Console.WriteLine(@"BlobContainerClient must be authorized with Shared Key 
                          credentials to create a service SAS.");
        return null;
    }
}

但是,Uri sasUri = containerClient.GenerateSasUri(sasBuilder); 行给了我一个错误,经过进一步研究,我改为使用:

StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);

但是,我还必须注释掉 if (containerClient.CanGenerateSasUri) 行,因为它总是错误的。显然这是因为“BlobContainerClient 必须使用共享密钥凭据授权才能创建服务 SAS。” 但据我所知,我使用的是共享密钥凭据。我没有使用 Azure AD 身份验证(尽管我知道这是推荐的方法)。我的 BlobServiceClient 正在像这样初始化:

string storageConnectionString = $"DefaultEndpointsProtocol=https;AccountName=propworx;AccountKey={storageAccountKey};EndpointSuffix=core.windows.net";
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConnectionString);

有人知道为什么 CanGenerateSasUri 是假的吗?

【问题讨论】:

  • 你受到了一个错误的影响,它已在 nuget 12.8.0 版本中得到修复。更多信息:github.com/Azure/azure-sdk-for-net/issues/16979
  • @user963935 是完全正确的,我什至认为如果不是评论,这可能是“答案”。接受的答案解决了问题,但迫使我们使用超出我们需要的凭据。如果将 Azure.Storage.Blobs 包升级到 12.8.0(或 Azure.Storage.Files.DataLake 到 12.6.0),从顶部 BlobServiceClient(或系统客户端)创建的每个对象都将继承 CanGenerateSasUri 的值 (true)。

标签: c# azure asp.net-core azure-storage azure-container-service


【解决方案1】:

“必须使用共享密钥凭据授权 BlobContainerClient 才能创建服务 SAS。”意味着您应该直接使用凭据构建BlobContainerClient 而不是BlobServiceClient,然后将其传递给GetServiceSasUriForContainer 方法。

例如,使用下面的代码:

        var storageAccountName = "xxx";
        var storageAccountKey = "xxx";
        var container_name = "xxx";

        StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);

        //build the blob container url
        string blobcontainer_url = string.Format("https://{0}.blob.core.windows.net/{1}", storageAccountName, container_name);

        //directly build BlobContainerClient, then pass it to GetServiceSasUriForContainer() method
        BlobContainerClient blobContainer = new BlobContainerClient(new Uri(blobcontainer_url), credential);

        Uri mysasuri = GetServiceSasUriForContainer(blobContainer, null);

测试结果:

【讨论】:

  • 感谢这对我来说效果很好..ms 文档不是很清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2012-03-29
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多