Azure 存储:如何使用 .NET SDK 生成 SAS 连接字符串

Posted

技术标签:

【中文标题】Azure 存储:如何使用 .NET SDK 生成 SAS 连接字符串【英文标题】:Azure Storage: How to generate a SAS connection string using .NET SDK 【发布时间】:2020-12-31 12:49:50 【问题描述】:

我目前正在使用 Microsoft.WindowsAzure.Storage.CloudStorageAccount 类生成 SAS 令牌,如下所示:

var cloudStorageAccount = // create a new CloudStorageAccount
var sharedAccessAccountPolicy = new SharedAccessAccountPolicy

    Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write,
    Services = SharedAccessAccountServices.Blob,
    ResourceTypes = SharedAccessAccountResourceTypes.Object,
    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
    Protocols = SharedAccessProtocol.HttpsOnly
;

var token = cloudStorageAccount.GetSharedAccessSignature(sharedAccessAccountPolicy);

但是,这会返回一个前面带有 ? 的令牌,并且不包括 blob 端点。我正在查看这个 documentation 并注意到一个 SAS 如下所示:

BlobEndpoint=https://storagesample.blob.core.windows.net;
SharedAccessSignature=sv=2015-04-05&sr=b&si=tutorial-policy-635959936145100803&sig=9aCzs76n0E7y5BpEi2GvsSv433BZa22leDOZXX%2BXXIU%3D

这样做的好处是我可以将它用作连接字符串来直接初始化BlockBlobClient

如何生成上述格式的令牌?我可以解析我自己的并删除?,然后添加BlobEndpointSharedAccessSignature 键,但这是手动工作,将来可能无法正常工作。是否有一种 SDK 方法可以按照 Microsoft 文档中显示的格式创建 SAS?

【问题讨论】:

【参考方案1】:

我相信您正在使用WindowsAzure.Storage 库。该库已弃用。

https://www.nuget.org/packages/WindowsAzure.Storage/

推荐使用的库是https://www.nuget.org/packages/Azure.Storage.Blobs (v12)

使用 v12 库,我能够为特定的 blob 获取 SASUri,并使用 SASUri 创建一个 BlobClient 以下载该 blob,而无需进行字符串格式化。

 BlobClient blobClient = new BlobClient("storage account conn string", "container name", "blob name");
        BlobSasBuilder blobSasBuilder = new BlobSasBuilder(BlobSasPermissions.Write | BlobSasPermissions.Read, DateTimeOffset.Now.AddDays(1))
        
            BlobContainerName = blobClient.BlobContainerName,
            BlobName = blobClient.Name
        ;

        var sasuri = blobClient.GenerateSasUri(blobSasBuilder);

        var blobClientWithSasUri = new BlobClient(sasuri);
        using (var fileStream = System.IO.File.OpenWrite(@"path to download"))
        
            blobClientWithSasUri.DownloadTo(fileStream);
        

【讨论】:

这是在服务器端生成的,看起来 Azure Functions v3 运行时仍使用已弃用的库。我可能需要为 v12 引入 nuget,但这会增加我的输出 DLL 大小并因此增加冷启动时间。 :| 哎呀!刚刚尝试创建一个由 blob 存储触发的 Azure 函数 v3,实际上它使用的是旧函数【参考方案2】:

您似乎使用此sample 创建帐户 SAS。它返回SharedAccessSignature 的值。

并且没有 SDK 可以获取上述 SAS 令牌格式,即使是最新的 SDK(azure.storage.blobs 12.7.0)。我试过azure.storage.blobs,它返回了没有'?'的SharedAccessSignature。恐怕你需要自己格式化。

Console.WriteLine($"BlobEndpoint=https://accountName.blob.core.windows.net;SharedAccessSignature=sasToken");

我不明白为什么需要将其更改为这种格式。如果只是在下一步中使用 sas 令牌,则默认结果可以正常工作。

【讨论】:

以上是关于Azure 存储:如何使用 .NET SDK 生成 SAS 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .NET v12 SDK 在 Azure Blob 存储中上传具有指定 ContentType 的 Blob?

使用 .NET SDK 获取 Azure Blob 存储区域?

与 v11 相比,使用 v12 将文件上传到 Azure Blob 存储 SDK 的 ASP.NET Core 使用更高的内存

Usql 与 Azure Data Lake Store .net SDK

Azure DevOps系列Azure DevOps构建.NET EFCore应用程序

如何获取 Azure 存储帐户密钥