Как получить список пулов и заданий пакетной службы Azure с помощью REST API на C #?

Используя REST API, я хочу получить список пакетных пулов и заданий.
Согласно документации:
Pool - Get | Документы Microsoft - https://docs.microsoft.com/en-us/rest/api/batchservice/pool/get
Работа - Get | Документы Microsoft - https://docs.microsoft.com/en-us/rest/api/batchservice/job/get

API для получения списка заданий - GET {batchUrl}/jobs?api-version=2019-08-01.10.0, а для получения пула - GET {batchUrl}/pools?api-version=2019-08-01.10.0
В C # я делаю это так:

client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
using (var responseGet = client.GetAsync(api).Result) //HttpClient client
{
    if (responseGet.IsSuccessStatusCode)
    {
        dynamic batchObjectsContent = JObject.Parse(responseGet.Content.ReadAsStringAsync().Result);
        foreach (var batchObject in batchObjectsContent.value)
        {
            batchObjects.Add(new BatchObject { Id = batchObject.id, Url = batchObject.url, CreationTime = batchObject.creationTime, StateTransitionTime = batchObject.stateTransitionTime });
        }
    }
}

Полный API для получения пула - https://mybatch.westus2.batch.azure.com/pools?api-version=2019-08-01.10.0, а API для задания - https://mybatch.westus2.batch.azure.com/jobs?api-version=2019-08-01.10.0.

Error message I am getting:
StatusCode=Unauthorized
ReasonPhrase="Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly."
error="invalid_audience", error_description="The access token has been obtained from wrong audience or resource 'https://management.azure.com/'. It should exactly match (including forward slash) with one of the allowed audiences 'https://batch.core.windows.net/'"

И вот как я получил токен доступа: authenticationContext.AcquireTokenAsync("https://management.azure.com/", credential).Result.AccessToken;. Это работает для всех API, связанных с https://management.azure.com/.

Из-за ошибок я думаю, что есть проблема либо с токеном доступа, либо с неправильными заголовками, либо с обоими. Как мне их исправить?


person Gour Gopal    schedule 06.12.2019    source источник


Ответы (1)


Используйте конечную точку ресурса пакетной службы Azure, чтобы получить токен для аутентификации запросов к пакетной службе:

https://batch.core.windows.net/

Используйте код, как показано ниже:

private const string BatchResourceUri = "https://batch.core.windows.net/";
AuthenticationResult authResult = await authContext.AcquireTokenAsync(BatchResourceUri, new ClientCredential(ClientId, ClientKey));

См. Эту статью.

person Joey Cai    schedule 06.12.2019
comment
Можем ли мы использовать аутентификацию MSI вместо предоставления идентификатора клиента и ключа клиента? - person Gour Gopal; 06.12.2019
comment
На всякий случай, если кто-то еще наткнется на этот комментарий, на него ответил stackoverflow.com/questions/59212231/. Вы можете использовать MSI для аутентификации с помощью пакетного SDK / REST. В настоящее время вы не можете включить MSI в пуле пакетов, но если вы инициируете запрос из службы, которая его поддерживает (то есть функций), вы должны иметь возможность аутентифицироваться. - person brklein; 06.12.2019