Справочная информация
Я выполняю спокойный вызов 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;
}
}