gpt4 book ai didi

c# - 在 Azure 存储上,CanGenerateSasUri 始终为 false

转载 作者:行者123 更新时间:2023-12-04 16:38:44 27 4
gpt4 key购买 nike

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

https://learn.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) 行,因为它始终为 false。显然这是因为“BlobContainerClient 必须使用共享 key 凭据进行授权才能创建服务 SAS。” 但据我所知,我正在使用共享 key 凭据。我没有使用 Azure AD 身份验证(尽管我知道这是推荐的方法)。我的 BlobServiceClient 正在像这样初始化:

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

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

最佳答案

“必须使用共享 key 凭据授权 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);

测试结果:

enter image description here

关于c# - 在 Azure 存储上,CanGenerateSasUri 始终为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65197379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com