Как сделать запрос на management.azure.com с GET-запросом? - PullRequest
1 голос
/ 10 октября 2019

Я использовал формат Public API для аутентификации с помощью AppId и ApiKey.

Совсем недавно мне пришлось пройти проверку подлинности в Azure Active Directory, чтобы запросить сведения о приложении.

Как я понял, чтение этого , когда я использую Azure Active Directory, мне нужно использовать management.azure.com. Из того, что я узнал из этого , мне нужно составить ссылку:

https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/microsoft.insights/components/{componentName}/query/query?api-version={apiVersion}&query={newQuery}

Если я правильно понимаю, странная /query/query часть состоит в том, как я долженинтерпретировать /{area}/[path].

Мой запрос выглядит примерно так:

requests
| where name =~ '{itemName}'
| where timestamp > datetime('{referenceDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}')
| project timestamp, id, name, success, customDimensions
| order by timestamp desc
| take 5

Я удаляю разрывы строк: -)

Я вызываю API следующим образом:

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    var response = client.GetAsync(url).Result;

Но я получаю неверный запрос.

Мне нужно получить запрос Application Insights с аутентификацией AAD (что я уже решил, так как без строки с Auth или с неверным значением я получаю Unauthorized),При регистрации приложения в Azure Active Directory мне не было предоставлено никаких вариантов добавления разрешений, кроме Data.Read - при использовании Post (код, отличный от представленного) я получил «Метод не разрешен».

Пожалуйста, сообщите.

Редактировать

Я попытался выполнить тот же запрос в Почтальоне.

{
  "error": {
    "message": "The request had some invalid properties",
    "code": "BadArgumentError",
    "innererror": {
        "code": "SemanticError",
        "message": "A semantic error occurred.",
        "innererror": {
            "code": "SEM0100",
            "message": "'' operator: Failed to resolve table or column or scalar expression named 'requests'"
        }
    }
  }
}

Даже когда я сократил параметр query до requests. Поэтому я не знаю, как передать запрос в вызове GET API.

1 Ответ

1 голос
/ 11 октября 2019

Во-первых, формат API должен быть таким, как показано ниже, а не тот, который вам нужен, его можно найти в скрипте powershell в этой ссылке .

GET https://management.azure.com/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/microsoft.insights/components/<appinsight-name>/api/query?api-version=2014-12-01-preview&query=requests|where timestamp > ago(24h)|count

На самом деле,если вы хотите вызвать этот API-интерфейс с помощью аутентификации Azure AD, лучше всего найти способ использовать библиотеку Microsoft.Azure.Services.AppAuthentication, не нужно создавать приложение AD, просто получите токен доступа с кодом, как показано нижезатем используйте токен для вызова API.

Примечание : при запуске кода убедитесь, что ваша учетная запись пользователя, который входит в Visual Studio, имеет роль RBAC (например, Owner / Contributor) в вашей подписке или в приложении Insight. Если нет, перейдите по этой ссылке для предоставления доступа.

static void Main(string[] args)
    {
        AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
        string accessToken = azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/").Result;
        Console.WriteLine(accessToken);
    }

Я проверяю токен в почтальоне, он отлично работает, вы также можете использовать его в коде.

enter image description here

...