Предоставление роли READER доступа к подписке в Azure прекрасно работает в Postman, но не через Angular. Зачем?
Хорошо, я мог бы упустить что-то простое здесь, в Angular, но я действительно мог бы использовать некоторую помощь. Я пытаюсь программно предоставить роль READER для участника службы. Если я использую PostMan, он работает нормально. Однако когда я отправляю тот же запрос PUT через Angular6, я получаю ошибку 400 от Azure, которая говорит:
Содержание вашего запроса было недействительным, и исходный объект не может быть десериализован. Сообщение об исключении: "Требуемые свойства" разрешения "не найдены в JSON. Путь 'свойства', строка 1, позиция 231.'
JSON, отправляемый в обоих случаях:
{
"properties":
{
"roleDefinitionId":"/subscriptions/{some_subscription_guid}/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7",
"principalId":"{some_service_provider_guid}"
}
}
Я получил трафик от обоих запросов, и они отображаются как полезные данные application/json на PUT. Таким образом, я в растерянности того, что неправильно десериализуется через Azure, что вызывает эту ошибку. Я пытаюсь следовать инструкциям REST, задокументированным здесь: https://docs.microsoft.com/en-us/azure/role-based-access-control/role-assignments-rest
Есть идеи, что мне не хватает?
ОБНОВИТЬ
Добавление RAW REQUEST для каждого запроса. Я заменил любые конфиденциальные данные (токен доступа, GUID и т. Д.), Не изменяя ничего из вывода Fiddler.
PUT https://management.azure.com/subscriptions/<VALID_SUBSCRIPTION_WAS_HERE>/providers/Microsoft.Authorization/roleDefinitions/7ec2aca1-e4f2-4152-aee2-68991e8b48ad?api-version=2015-07-01 HTTP/1.1
Host: management.azure.com
Connection: keep-alive
Content-Length: 233
Accept: application/json, text/plain, */*
Origin: http://localhost:4200
Authorization: Bearer <VALID_TOKEN_WAS_HERE>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Content-Type: application/json
Referer: http://localhost:4200/token/<VALID_DOMAIN_WAS_HERE>.onmicrosoft.com/graph
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
{"properties": { "roleDefinitionId":"/subscriptions/<VALID_SUBSCRIPTION_GUID_HERE>/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7", "principalId":"<VALID_OBJECTID_HERE>" }}
1 ответ
Хорошо, я наконец понял, что здесь происходит. Похоже, что я отправил сообщение не в ту конечную точку. Мне нужно публиковать в roleAssignment, а не roleDefinitions.
Так почему же это работает в PostMan? Похоже, есть откат от предыдущей версии API, которая поддерживала оба варианта при использовании устаревших клиентов, которые по какой-то причине попали под PostMan. Однако при публикации через Angular он активно отвергал его.
Конечный результат... отправьте в "/Microsoft.Authorization/roleassignments/" с версией API более поздней, чем "api-version=2015-07-01". Все будет работать.