【问题标题】:List all Azure blobs using a service principal with .NET Core使用带有 .NET Core 的服务主体列出所有 Azure Blob
【发布时间】:2020-10-26 05:51:03
【问题描述】:

我的目标是编写一个 .NET Core Azure 备份应用程序,该应用程序仅对具有列表/读取权限的 Azure Blob 存储具有读取权限。

具体来说,我想列出一个容器中的所有 blob。

因此,在每个存储帐户中使用访问密钥并不是一个好方法,因为 a) 应用程序将具有完整的写入/删除访问权限,并且 b) 我必须为每个存储帐户提供一个密钥(并且有多个存储帐户)。另外,我不想使用“共享访问签名”的另一个选项,因为它们适用于每个容器,而且我有很多容器(即 20 个存储帐户,最多 20 个容器)。

因此,我想在 Azure Active Directory 中设置一个只读服务主体 >> 使用 clientId、tenantId 和 clientSecret 进行应用注册,并授予该只读访问权限。

我能够使用 Microsoft.Azure.Management.ResourceManager.Fluent.Core API 列出帐户和容器,但不能列出里面的 blob。如何在 .NET Core 中实现这一点?

var credentials = SdkContext.AzureCredentialsFactory
                .FromServicePrincipal((string)cg.LoginCredentials.clientId,
                    (string)cg.LoginCredentials.clientSecret,
                    (string)cg.LoginCredentials.tenantId,
                    AzureEnvironment.AzureGlobalCloud);
            

            //var credentials = SdkContext.AzureCredentialsFactory.FromFile(@"D:\azurecred.txt");
            var azure = Microsoft.Azure.Management.Fluent.Azure
                .Configure()
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .Authenticate(credentials)
                .WithDefaultSubscription();
            
            
            var account = azure.StorageAccounts.List().ToList();
            
            Task.Run(async () =>
            {
                var resourceGroups = await azure.ResourceGroups.ListAsync(true);
                var blobContainers = await azure.StorageAccounts.Manager.BlobContainers.ListAsync(account[4].ResourceGroupName,
                    account[4].Name);
                var blobList = blobContainers.ToList();
}

【问题讨论】:

  • 如果我没记错的话,您将需要使用不同的 SDK(Azure Storage SDK for .Net)来列出 blob 容器中的 blob。

标签: azure blob service-principal


【解决方案1】:

正如 Guarav 提到的,您需要使用 Azure 存储 SDK 并传递获取的 Azure AD 令牌来验证您的请求并列出 blob 及其内容:

Install-Package Azure.Identity
Install-Package Azure.Storage.Blobs

然后使用以下内容:

BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
                                                                new DefaultAzureCredential());

使用 containerClient ,您可以列出容器并列出容器内的 blob。

https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-app

【讨论】:

  • 感谢您的快速回答!那么是否有可能e。 G。以 backupuser@mycompany.com 身份登录,而不会显示模式。那么,应用程序是否配置为以该用户身份自动登录?
  • 您的应用服务必须分配一个托管标识,然后 DefaultAzureCredential 将使用它。不会显示任何提示
  • 我没有应用服务,而是一个 .NET Core Windows 控制台应用程序,其目的是列出/读取 blob。也许这根本不可能?也许一个人总是需要那个帐户密钥(或者每个容器都有一个 SAS,尽管这对于我们拥有的大约 200 个容器来说非常乏味)?
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多