Как составить список подписок с текущими учетными данными Azure (без регистрации приложения) с помощью С#

Я пытаюсь программно создать несколько виртуальных машин для нескольких подписок. Поэтому мне нужно перечислить все подписки, к которым я могу получить доступ. Но я не могу предоставить разрешения зарегистрированному приложению, поэтому мне приходится использовать собственные учетные данные Azure.

Затем я попытался

var subscriptionClient = new Microsoft.Azure.Management.ResourceManager.Fluent.SubscriptionClient(new DefaultAzureCredential());

а также

var subscriptionClient = new Microsoft.Azure.Management.ResourceManager.Fluent.SubscriptionClient(new UserPasswordCredential(username,password));

но ни один из них не компилируется.

Ответ на вопрос Как составить список подписок с помощью Microsoft.Azure.ResourceManager? почти ответ на мой вопрос, но я не могу добавить комментарий, чтобы задать больше вопросов об этом.

Я установил Microsoft.IdentityModel.Clients.ActiveDirectory версии 3.13.2.870 и попробовал:

 var ctx = new AuthenticationContext("https://login.microsoftonline.com/common");

но у ctx нет AcquireToken, у него есть только AcquireTokenAsync. К сожалению, следующий код все еще не работает

var mainAuthRes = await context.AcquireTokenAsync(m_resource, m_clientId, new Uri(m_redirectURI), PromptBehavior.Always);

Компилятор говорит, что четвертый параметр неверен, что означает

context.AcquireTokenAsync(string resource, string client , Uri uri , PromptBehavior promptBehavior )

не является допустимым методом.

Есть ли способ перечислить подписки с моими текущими учетными данными Azure (без регистрации приложения) с помощью С#?


person Milhouse Manastorm    schedule 18.01.2021    source источник
comment
Упомянутый вами ответ выглядит правильным, не могли бы вы показать подробности своего сообщения об ошибке вместо чего-то вроде but all failed, still doesn't work? Они бесполезны.   -  person Joy Wang    schedule 19.01.2021
comment
Он не компилируется. Конструктор SubscriptionClient нуждается в RestClient в качестве параметра.   -  person Milhouse Manastorm    schedule 19.01.2021


Ответы (2)


Попробуйте код работает для меня, он использует VisualStudioCredential из Azure.Identity< /a> для аутентификации будут перечислены все подписки во всех арендаторах AAD, к которым у вас есть доступ (учетная запись пользователя, вошедшая в VS).

using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Management.ResourceManager;
using Microsoft.Rest;
using System;
using System.Threading;

namespace ConsoleApp2
{
    class Program
    {
        public static void Main(string[] args)
        {
            VisualStudioCredential tokenCredential = new VisualStudioCredential();
            TokenRequestContext requestContext = new TokenRequestContext(new string[] { "https://management.azure.com" });
            CancellationTokenSource cts = new CancellationTokenSource();
            var accessToken = tokenCredential.GetToken(requestContext, cts.Token);
            ServiceClientCredentials serviceClientCredentials = new TokenCredentials(accessToken.Token);
            SubscriptionClient SubscriptionClient = new SubscriptionClient(serviceClientCredentials);
            var tenants = SubscriptionClient.Tenants.List();
            foreach (var tenant in tenants)
            {
                //Console.WriteLine(tenant.TenantId);
                VisualStudioCredentialOptions visualStudioCredentialOptions = new VisualStudioCredentialOptions{ TenantId = tenant.TenantId };
                VisualStudioCredential tokenCredential1 = new VisualStudioCredential(visualStudioCredentialOptions);
                TokenRequestContext requestContext1 = new TokenRequestContext(new string[] { "https://management.azure.com" });
                CancellationTokenSource cts1 = new CancellationTokenSource();
                var accessToken1 = tokenCredential1.GetToken(requestContext, cts1.Token);
                ServiceClientCredentials serviceClientCredentials1 = new TokenCredentials(accessToken1.Token);
                SubscriptionClient SubscriptionClient1 = new SubscriptionClient(serviceClientCredentials1);
                var subs = SubscriptionClient1.Subscriptions.List();
                foreach (var sub in subs)
                {
                    //Console.WriteLine(sub.DisplayName);
                    Console.WriteLine($"SubscriptionName : {sub.DisplayName}");
                    Console.WriteLine($"SubscriptionId   : {sub.SubscriptionId}");
                    Console.WriteLine($"TenantId         : {tenant.TenantId}");
                    Console.WriteLine($"State            : {sub.State}");
                    Console.WriteLine();
                }

            }
        }
            
    }
}

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

person Joy Wang    schedule 19.01.2021
comment
попробую, спс - person Milhouse Manastorm; 19.01.2021
comment
SubscriptionClient SubscriptionClient = new SubscriptionClient(serviceClientCredentials); не компилируется. Каково пространство имен SubscriptionClient? Я пробовал Microsoft.Azure.Management.ResourceManager.Fluent.SubscriptionClient, но он не компилируется - person Milhouse Manastorm; 19.01.2021
comment
@MilhouseManastorm Не то чтобы это Microsoft.Azure.Management.ResourceManager, предварительная версия, nuget nuget.org /packages/Microsoft.Azure.Management.ResourceManager - person Joy Wang; 20.01.2021
comment
Меня устраивает. Благодарю вас! - person Milhouse Manastorm; 20.01.2021

Вы можете попробовать использовать REST API Подписки — Список .

GET https://management.azure.com/subscriptions?api-version=2020-01-01

Заголовок запроса:

Authorization: Bearer <access token>

Обновление:

Самый простой способ получить токен доступа — открыть ссылку Подписки — Список и войдите в свою учетную запись.

Затем нажмите «Попробовать» в правом верхнем углу скрипта.

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

Вы найдете токен доступа в предварительном просмотре запроса.

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

person Jane Ma-MSFT    schedule 19.01.2021
comment
Как получить токен доступа? - person Milhouse Manastorm; 19.01.2021
comment
@Milhouse Manastorm, я обновил свой ответ~ - person Jane Ma-MSFT; 19.01.2021
comment
Срок действия токена истекает в будущем - person Milhouse Manastorm; 19.01.2021