it-swarm.com.ru

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

Фон

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

https://docs.Microsoft.com/en-gb/rest/api/consump/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- общий секрет

 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;
     }
 }
4
Dan Cundy

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

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

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

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

Требуемые разрешения

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

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

     enter image description here

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

     enter image description here

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

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

     enter image description here

     enter image description here

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

1
Rohit Saigal