Использование 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 и создание нового для принципа обслуживания решило проблему.
Ваш участник службы не имеет доступа к группе ресурсов.
- Войдите в портал Azure и выберите группу ресурсов.
- Выберите Контроль доступа (IAM) от Blade
- На вкладке "Проверка доступа" добавьте назначение роли.
- Дайте своему руководителю службы роль (Владелец / Автор / Читатель)
- Назначить доступ: пользователю, группе или субъекту службы Azure AD
- Введите имя участника службы, выполните поиск и выберите его, затем "Сохранить".
- Подождите пару минут и попробуйте снова вызвать свой 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;
}