必须如何存储 Azure Blob 存储连接数据才能支持所有可用的寻址模式?
Posted
技术标签:
【中文标题】必须如何存储 Azure Blob 存储连接数据才能支持所有可用的寻址模式?【英文标题】:How does Azure BlobStorage connection data have to be stored to support all available addressing modes? 【发布时间】:2022-01-03 18:31:30 【问题描述】:我正在使用库 Microsoft.Azure.Storage.Blob
11.2.3.0 和 Microsoft.Azure.Storage.Common
11.2.3.0 从 .NET Core 3.1 应用程序连接到 Azure BlobStorage。
我的应用程序的用户应该向 Azure BlobStorage 提供连接信息到应用程序将存储/检索数据的位置。
最初,我假设允许用户指定 连接字符串 和自定义 blob 容器名称(作为默认值的可选覆盖)就足够了。我可以简单地将该连接字符串填充到CloudStorageAccount.Parse
方法中,然后取回一个存储帐户实例以调用CreateBlobCloudClient
。
现在我正在尝试使用此方法通过特定于容器的 SAS 进行连接(另请参阅 my other question about that),看来连接字符串可能不是最通用的方法。
相反,现在似乎是一个 blob 容器 URL,加上一个 SAS 令牌或一个帐户密钥(可能还有一个帐户名称,认为它似乎已经包含在 blob 容器 URL 中)更多多才多艺的。但是,我担心指向我需要支持的 blob 存储的下一种方式(无论哪种方式)可能需要另一种信息 - 因此我的问题是:
我需要在我的应用程序的配置文件中支持哪些“字段”集,以确保我的用户可以以任何他们想要的方式指向他们的 BlobStorage,只要他们有 一个 BlobStorage?
(微软甚至可能有标准解决方案或最佳实践推荐吗?)
请注意,我只关心要存储的什么。任意长的字符串?一个复杂的对象?如果有,有哪些字段?
一旦我知道它必须包含什么,我就不会问 如何 存储该配置。例如,这与安全加密凭据等无关。
【问题讨论】:
【参考方案1】:关于解决方法要使用 SAS 令牌访问存储帐户,如果您尝试上传,您需要传递 帐户名称以及 SAS 令牌和 Blob 名称,并且您需要授予您的 SAS 权限令牌。
Microsoft 建议尽可能使用 Azure Active Directory (Azure AD) 来授权针对 blob 和队列数据的请求,而不是使用共享密钥。 Azure AD 提供优于共享密钥的安全性和易用性。有关使用 Azure AD 授权访问数据的详细信息,see Authorize access to Azure blobs and queues using Azure Active Directory.。
注意:根据我的测试,您需要传递存储帐户名称和 SAS 令牌以及容器名称和 Blob 名称
示例: 我尝试使用容器级 SAS Token 将文件上传到容器。能够成功上传文件。
const string sasToken = "SAS Token";
StorageCredentials storageCredentials = new StorageCredentials(sasToken);
const string accountName = "teststorage65";//Account Name
const string blobContainerName = "test";
const string blobName = "test.txt";
const string myFileLocation = @"Local Path ";
var storageAccount = new CloudStorageAccount(storageCredentials, accountName, null, true);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(blobContainerName);
//blobContainer.CreateIfNotExists();
CloudBlockBlob cloudBlob = blobContainer.GetBlockBlobReference(blobName);
cloudBlob.UploadFromFile(myFileLocation);
如您所知,您可以使用存储连接字符串来连接存储。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("Connection string");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("test");
您的应用程序需要在运行时访问连接字符串以授权对 Azure 存储的请求。
您有多种存储连接字符串或 SAS 令牌的选项
1)您可以将连接字符串存储在环境变量中。
2) 在桌面或设备上运行的应用程序可以将连接字符串存储在 app.config 或 web.config 中文件。将连接字符串添加到这些文件中的 AppSettings 部分。
3) 在 Azure 云服务中运行的应用程序可以将连接字符串存储在 Azure 服务配置架构 (.cscfg) 文件中。将连接字符串添加到服务配置文件的 ConfigurationSettings 部分。
参考:https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string
【讨论】:
谢谢 - 所以,毕竟使用连接字符串是可能的。我认为我的问题是我试图使用ListContainers()
枚举容器。我的期望是 BlobStorage 会根据我的 SAS 可以访问的内容返回过滤后的容器列表;相反,它会抛出异常。如果我使用GetContainerReference
直接访问特定容器,它可以工作。以上是关于必须如何存储 Azure Blob 存储连接数据才能支持所有可用的寻址模式?的主要内容,如果未能解决你的问题,请参考以下文章
请求令牌时如何在 Azure 存储 Blob 中为 REST 请求指定范围? [AZURE-BLOB][REST API]
Azure 存储帐户:Blob 服务 (SAS) 连接检查失败