Токен аутентификации не имеет доступа на уровне регистрации - PullRequest
0 голосов
/ 29 ноября 2018

Справочная информация

Я выполняю спокойный вызов API для конечной точки потребления Microsoft Azure, как описано ниже.

https://docs.microsoft.com/en-gb/rest/api/consumption/reservationrecommendations/list

Однако мне всегда сообщают об ошибке ниже.

Токен аутентификации не имеет доступа на уровне регистрации.

{
  "error": {
    "code": "401",
    "message": "Authentication token doesn't have enrollment level access. 
  }
}

Токен действителен и можетиспользоваться для доступа к другим конечным точкам в API потребления.Тестовая ссылка «Попробуйте» на странице Azure фактически возвращает 200, однако, когда я звоню, я получаю 401.

Вопрос

Может кто-нибудь сбросить любойсвет на это сообщение об ошибке?Я нигде не могу найти помощь по этой ошибке.

Код

Аутентификация

https://docs.microsoft.com/en-gb/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow#first-case-access-token-request-with-a-shared-secret

 private static string GetAccessToken(string clientId, string clientSecret, string tenantId)
    {

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json;");

        string hostname = $"https://login.microsoftonline.com/{tenantId}/oauth2/token";

        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("grant_type", "client_credentials"),
            new KeyValuePair<string, string>("client_id", clientId),
            new KeyValuePair<string, string>("client_secret", clientSecret),
            new KeyValuePair<string, string>("resource", "https://management.azure.com/")
        });

        HttpResponseMessage httpResponse = client.PostAsync(hostname, content).Result;
        var responseString = httpResponse.Content.ReadAsStringAsync();

        if (httpResponse.StatusCode == HttpStatusCode.OK)
        {
            dynamic tokenObject = JsonConvert.DeserializeObject(responseString.Result);

            return tokenObject.access_token;
        }
        else
        {
            return null;
        }
    }

API Call

 public static dynamic GetReservationRecommendations(Params parameters)
 {
   var token = GetAccessToken(parameters.ClientId, parameters.ClientSecret, parameters.TenantId);

     HttpClient client = new HttpClient();
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
     client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json;");

     string hostname = $"https://management.azure.com/subscriptions/{parameters.SubscriptionId}/providers/Microsoft.Consumption/reservationRecommendations?api-version=2018-10-01";

     HttpResponseMessage httpResponse = client.GetAsync(hostname).Result;
     var responseString = httpResponse.Content.ReadAsStringAsync();

     if (httpResponse.StatusCode == HttpStatusCode.OK)
     {
         return responseString.Result;
     }
     else
     {
         return null;
     }
 }

1 Ответ

0 голосов
/ 06 декабря 2018

Причина ошибки

Идентификация приложения, которое вы используете для получения токена, не имеет достаточных разрешений для API потребления - Список рекомендаций по бронированию

ПопробуйтеТестовая ссылка работает, но код не

AFAIK. Ссылка "Попробуй" попросит вас сначала войти в систему с помощью учетной записи в браузере.Таким образом, он использует идентификацию пользователя, а не идентификацию приложения.Таким образом, возможно, что пользователь, с которым вы тестируете, имеет достаточно высокие разрешения / роль, но код, конечно, использует clientId и clientSecret, поэтому он все равно может завершиться ошибкой, если приложение не получит все необходимые разрешения.

Обязательноpermissions

  1. Этот API использует разрешения ARM, поэтому вашему субъекту службы приложений должны быть предоставлены разрешения.Как минимум роль «Читатель по управлению затратами».(Возможно, вы сделали это, поскольку упомянули о работе других конечных точек)

    На портале Azure перейдите в раздел Подписки> Ваша подписка> IAM

    enter image description here

    Затем добавьте назначение роли для субъекта службы вашего приложения

    enter image description here

  2. Просмотр сообщения об ошибке «Токен аутентификации»У меня нет доступа на уровне регистрации. ", я думаю, ваша подписка Azure находится под EA (т. е. Enterprise Agreement).Я говорю это потому, что мне удалось воспроизвести точно такое же сообщение об ошибке только в подписке EA, а не в другой обычной подписке с оплатой по факту, когда у субъекта службы уже была роль «Читатель по управлению затратами».Если ваша подписка работает под управлением EA, выполните также следующие шаги.

    Поэтому необходимо предоставить разрешения на портале Azure и корпоративном портале (портале EA).Посмотрите на эту документацию Microsoft для точных деталей. Назначение доступа к данным Управления затратами

    enter image description here

    enter image description here

    Пожалуйста, следуйте этой документации для шагов, связанных с порталом EA. Включить доступ к расходам на портале EA enter image description here

...