Azure 存储:如何使用 .NET SDK 生成 SAS 连接字符串
Azure Storage: How to generate a SAS connection string using .NET SDK
我目前正在使用 Microsoft.WindowsAzure.Storage.CloudStorageAccount
class 生成 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);
但是,这个 returns 一个前面有 ?
的令牌,不包括 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
。
如何生成上述格式的令牌?我可以解析我自己的并删除 ?
然后添加 BlobEndpoint
和 SharedAccessSignature
键,但这是手动工作,将来可能无法正常运行。是否有一种 SDK 方法可以按照 Microsoft 文档中显示的格式创建 SAS?
看来你是用这个sample创建一个帐户SAS的。它 returns 的值 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 token,默认的结果就可以了。
我相信您正在使用 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);
}
我目前正在使用 Microsoft.WindowsAzure.Storage.CloudStorageAccount
class 生成 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);
但是,这个 returns 一个前面有 ?
的令牌,不包括 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
。
如何生成上述格式的令牌?我可以解析我自己的并删除 ?
然后添加 BlobEndpoint
和 SharedAccessSignature
键,但这是手动工作,将来可能无法正常运行。是否有一种 SDK 方法可以按照 Microsoft 文档中显示的格式创建 SAS?
看来你是用这个sample创建一个帐户SAS的。它 returns 的值 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 token,默认的结果就可以了。
我相信您正在使用 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);
}