Использование API REST Azure в приложении C# не показывает ответа

Когда я пытаюсь использовать Azure Rest Apl URL на Azure Docs Post Man, я могу получить JSON, который имеет все группы ресурсов. https://docs.microsoft.com/en-us/rest/api/resources/resourcegroups/list ссылка

Но я пытаюсь сделать это из приложения ASP.NET MVC Core C#, я получаю пустой массив.

    public async Task<ResourceGroupModel> GetResourceGroupStatus()
    {
        ResourceGroupModel resourceGroupModel = null;
        try         
        { 
            string requestUrlString = iconfiguration.GetValue<string>("HealthSettings:AzureGetResourcesBySubscriptionURL");
            string azureSubscription = iconfiguration.GetValue<string>("HealthSettings:AzureSubscription");
            string clientId = iconfiguration.GetValue<string>("HealthSettings:ClientId");
            string tenantId = iconfiguration.GetValue<string>("HealthSettings:TenantId");
            string clientSecret = iconfiguration.GetValue<string>("HealthSettings:ClientSecret");
            Uri requestUrl = new Uri(requestUrlString.Replace("{subscriptionId}", azureSubscription));

            string token = await GetAccessToken(tenantId, clientId, clientSecret);

            _httpClient.DefaultRequestHeaders.Remove("Authorization");
            _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);

            var response = _httpClient.GetAsync(requestUrl);

            if (response.Result.IsSuccessStatusCode)
            {
                var data = response.Result.Content.ReadAsStringAsync();
                resourceGroupModel = ResourceGroupModel.FromJson(data.Result.ToString());
            }
        }
        catch (Exception ex)
        {
        }
        return resourceGroupModel;
    }

Не могли бы вы помочь мне избавиться от странного поведения API REST Azure. Спасибо заранее.:)

3 ответа

Решение

Удаление существующего clientsecret и создание нового для принципа обслуживания решило проблему.

Ваш участник службы не имеет доступа к группе ресурсов.

  1. Войдите в портал Azure и выберите группу ресурсов.
  2. Выберите Контроль доступа (IAM) от Blade
  3. На вкладке "Проверка доступа" добавьте назначение роли.
  4. Дайте своему руководителю службы роль (Владелец / Автор / Читатель)
  5. Назначить доступ: пользователю, группе или субъекту службы Azure AD
  6. Введите имя участника службы, выполните поиск и выберите его, затем "Сохранить".
  7. Подождите пару минут и попробуйте снова вызвать свой API.

Как сказал Ciubotariu, у вашего участника службы нет доступа к группе ресурсов. Однако, если вы только добавите своего участника службы в группу ресурсов, вы сможете получить только указанную группу ресурсов. Итак, добавьте ваш принципал обслуживания в вашу подписку. Вот шаги:

1. Перейдите в свою подписку, нажмите Контроль доступа> Добавить (Добавить назначение роли)

2. Добавьте участника службы и назначьте ему роль, например Contributor.

3. Затем вы получите все группы ресурсов для подписки.

Обновить:

4. Вот полный код, который я использовал:

var appId = "xxxxxxxxxxxxxxx";
var secretKey = "xxxxxxxxxxxxxxxxxxxxx";
var tenantId = "xxxxxxxxxxxxxxxxx";
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
ClientCredential clientCredential = new ClientCredential(appId, secretKey);
var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
var accessToken = tokenResponse.AccessToken;
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
    var baseUrl = new Uri($"https://management.azure.com/");
    var requestURl = baseUrl +
                    @"subscriptions/xxxxxxxxxxxxxxxx/resourcegroups?api-version=2019-05-01";
    var response = client.GetAsync(requestURl).Result.Content.ReadAsStringAsync().Result;
}
Другие вопросы по тегам