【发布时间】: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