. NET Приложение Core Console: чтение списка Azure больших двоичных объектов хранилища в качестве пользователя, доступного только для чтения - PullRequest
0 голосов
/ 09 июля 2020

У меня проблема, которую я не могу решить:

У нашей компании есть ок. 20 Azure учетных записей с прибл. По 20 контейнеров. Я хочу написать консольное приложение. NET Core, которое я могу запустить на сервере (не Azure) Windows для резервного копирования больших двоичных объектов с доступом только для чтения к серверу (не Azure) .

Если бы я использовал ключи доступа к хранилищу, у меня были бы проблемы: а) мне понадобится 20 разных ключей доступа и б) ключи доступа обеспечивают полный доступ, что я не хочу предоставлять этому консольное приложение из соображений безопасности. Хуже того, используя аутентификацию с SAS, я бы получил прибл. 400 различных ключей SAS (20 учетных записей х 20 контейнеров).

Теперь: Azure, я создал нового пользователя, например, «backupuser@mycompany.com», который является глобальным считывателем - поэтому нет возможности писать / delete, что удовлетворит вопросы безопасности. Я зарегистрировал свое приложение как приложение Windows.

Однако, несмотря на то, что я прочитал и опробовал так много способов, я не смог понять, как мое консольное приложение может автоматически входить в систему, например, через Azure Active Directory (пароль) с именем пользователя + паролем backupuser@mycompany.com. Также было бы важно сохранить имя пользователя / пароль, например, в настройках приложения. json).

Можете ли вы предоставить. NET Core C# код, как Я могу а) войти в систему и б) перечислить все большие двоичные объекты в одной учетной записи хранения >> контейнере?

Большое спасибо !!

Мартин

1 Ответ

0 голосов
/ 13 июля 2020

В соответствии с вашими потребностями я предлагаю вам использовать Azure AD auth для доступа к Azure Blob. Если вы используете этот способ, нам нужно присвоить Storage Blob Data Reader пользователю или принципалу службы. После этого пользователь или субъект-служба получает разрешение на перечисление контейнеров и больших двоичных объектов. Для получения дополнительных сведений см. здесь и здесь

Например

  1. Создайте принципала службы и назначьте роль Storage Blob Data Reader для sp
az login

# assign role at the description level the sp can manage all storage account in the subscription
az ad sp create-for-rbac -n "ManageStorage" --role "Storage Blob Data Reader"

enter image description here

  1. Установить переменные среды
setx AZURE_CLIENT_ID <your-clientID>

setx AZURE_CLIENT_SECRET <your-clientSecret>

setx AZURE_TENANT_ID <your-tenantId>
Приложение

а. SDK

<PackageReference Include="Azure.Identity" Version="1.1.1" />
    <PackageReference Include="Azure.Storage.Blobs" Version="12.4.4" />

б. Код

            string accountName = "jimtestdiag417";
            string url = string.Format("https://{0}.blob.core.windows.net/", accountName);
            var account = new BlobServiceClient(new Uri(url), new DefaultAzureCredential());
            string containerContinuationToken = null;
            int pageSizeHint = 5; //The size of Page<T>s that should be requested 
            // list conatnies in the storage account
            do
            {
                var containerResultSegment = account.GetBlobContainersAsync().AsPages(containerContinuationToken, pageSizeHint);
                await foreach (Page<BlobContainerItem> containerPage in containerResultSegment) {

                    foreach (var container in containerPage.Values) {

                        Console.WriteLine( string.Format("The blobs in the container {0} are as follows ", container.Name));
                        string blobContinuationToken = null;
                        // list blobs in the container
                        do
                        {

                            var blobResultSegment = account.GetBlobContainerClient(container.Name).GetBlobsAsync().AsPages(blobContinuationToken, pageSizeHint);
                            await foreach (Page<BlobItem> blobPage in blobResultSegment)
                            {

                                foreach (var blob in blobPage.Values)
                                {
                                       Console.WriteLine(blob.Name);
                                    
                                }

                            }
                        } while (blobContinuationToken != null);

                       
                    }
                }
            } while (containerContinuationToken != null);

введите описание изображения здесь

...