C# 在Azure存储上,CanGenerateSasUri总是错误的
我有一个ASP.NETCore3.1WebAPI,它使用Azure存储。 为此,它使用了Microsoft.Azure.Storage.Blob库。 NuGet软件包管理器通知我此软件包已被弃用,我更愿意使用Azure.Storage.Blobs。 我这样做了,并继续修复所有由于此更改而损坏的代码。 在我找到为客户端生成共享访问签名(SAS)的代码之前,我没有遇到很多问题。 无论如何,我通过以下代码成功地实现了这一点: 但是,行C# 在Azure存储上,CanGenerateSasUri总是错误的,c#,azure,asp.net-core,azure-storage,azure-container-service,C#,Azure,Asp.net Core,Azure Storage,Azure Container Service,我有一个ASP.NETCore3.1WebAPI,它使用Azure存储。 为此,它使用了Microsoft.Azure.Storage.Blob库。 NuGet软件包管理器通知我此软件包已被弃用,我更愿意使用Azure.Storage.Blobs。 我这样做了,并继续修复所有由于此更改而损坏的代码。 在我找到为客户端生成共享访问签名(SAS)的代码之前,我没有遇到很多问题。 无论如何,我通过以下代码成功地实现了这一点: 但是,行urisasuri=containerClient.Generat
urisasuri=containerClient.GenerateSasUri(sasBuilder)代码>给了我一个错误,经过进一步研究,我改为使用:
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);
但是,我还必须注释掉行if(containerClient.CanGenerateSasUri)
,因为它总是false。显然,这是因为“BlobContainerClient必须使用共享密钥凭据进行授权才能创建服务SAS。”但据我所知,我使用的是共享密钥凭据。我没有使用Azure AD身份验证(尽管我知道这是推荐的mnethod)。我的BlobServiceClient正在进行如下初始化:
string storageConnectionString = $"DefaultEndpointsProtocol=https;AccountName=propworx;AccountKey={storageAccountKey};EndpointSuffix=core.windows.net";
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConnectionString);
有人知道为什么CanGenerateSasUri是假的吗?必须使用共享密钥凭据授权BlobContainerClient来创建服务SAS。“这意味着您应该直接构建BlobContainerClient
,而不是使用凭据构建BlobServiceClient
,然后将其传递给getservicesauriforcontainer
方法
例如,使用以下代码:
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文档不是很清楚您受到了一个bug的影响,它在12.8.0版本的nuget中得到了修复。更多信息:@user963935完全正确,我甚至认为这可能是“答案”,如果不是评论的话。公认的答案解决了问题,但迫使我们使用的凭据超过了我们的需要。如果将Azure.Storage.Blobs包升级到12.8.0(或将Azure.Storage.Files.DataLake升级到12.6.0),则从顶级BlobServiceClient(或系统客户端)创建的每个对象都将继承CanGenerateSasUri的值(true)。
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);