#c# #microsoft-graph-api #azure-ad-graph-api
#c# #microsoft-graph-api #azure-ad-graph-api
Вопрос:
Я использую Microsoft Graph API для доступа к некоторым событиям в Azure AD Outlook моей компании.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу получить доступ к CalendarView (или на самом деле я вообще не могу получить доступ к пользователю), когда я пытаюсь указать пользователя с помощью UUID вместо электронной почты. Странно то, что электронная почта работает просто отлично, но мне не разрешено хранить электронные письма за пределами Azure AD, поэтому ID будет предпочтительным методом.
Вот точный вызов API, который я пытаюсь выполнить: https://docs.microsoft.com/en-us/graph/api/user-list-calendarview?view=graph-rest-1.0amp;tabs=csharp Но во всех примерах используется только средство .Me
доступа, а не .Users[{ID | userPrincipalName}]
Я совершенно уверен, что UUID, который я использую, правильный, поскольку он получен из вызова API ранее. Или статья документации означает что-то другое, чем пользовательский UUID by {ID | userPrincipalName}
?
Комната выглядит так (при чтении как объект JSON):
{
"id": "00000000-0000-0000-0000-000000000000"
"emailAdress": "room@company"
...
}
Это работает:
await graphClient.Users["room@company"].CalendarView.Request(queryOptions).GetAsync();
Пока это не работает:
await graphClient.Users["00000000-0000-0000-0000-000000000000"].CalendarView.Request(queryOptions).GetAsync();
При использовании UUID я получаю (идентификаторы здесь не показаны):
Code: ErrorInvalidUser
Message: The requested user '<UUID>' is invalid
ClientRequestId: <some ID>
Я проверил это с жестко заданным идентификатором комнаты и электронной почтой, а также с объектом ID, который я получаю при вызове списка комнат в C #.
Еще одно несоответствие, с которым я столкнулся, заключается в том, что я могу прочитать весь список microsoft.graph.room через http-запрос, но не используя C # Microsoft.График.Пакет аутентификации. Однако чтение данных комнаты, из которой я знаю электронное письмо, работает.
Так это просто не работает, и в документе об этом не сказано?
Делает Microsoft.График.Пакет аутентификации не поддерживает такие запросы?
Или я использую неправильный идентификатор?
Саладино
Комментарии:
1. Outlook использует адрес электронной почты. Коду требуется приложение с календарем, которое является частью Outlook. Откуда взялся бы календарь, если вы используете UUID? У вас есть CalendarGroup, настроенная в Outlook?
2. Я вызываю Graph-API, чтобы получить список соответствующих комнат (мест типа microsoft.graph.location), а затем пытаюсь найти все события за определенное время, которые там происходят. Из данной комнаты я получаю электронное письмо, связанное с этой комнатой, и я могу найти в нем все события, но когда я использую «идентификатор» комнаты, кажется, что он вообще не существует.
3. Я бы использовал ID, а не UUID для вызовов API; возможно, вы захотите протестировать UUID с помощью Microsoft Graph Explorer, чтобы узнать, работает ли он для пользователя или нет..
4. Кроме того, я бы попробовал следующее: (1) Посмотрите, существует ли пользователь в AAD / M365 (2) Возникает ли проблема только при вызове из вашего приложения или из Microsoft Graph Explorer (попробуйте вышеуказанного пользователя, который получает ошибку, и посмотрите, может ли он вызвать Graph API илине) также? Это поможет вам изолировать проблему. (3) Если вы все еще видите проблему в своем приложении, стоит проверить, какая информация пользователя передается с вызовом API, и также проверить токен, используя jwt.ms
5. Я имел в виду свойство UniqueID объекта microsoft.graph.location, которое я уже получил. Он находится в формате UUID, но называется только UniqueID .
Ответ №1:
Согласно некоторым тестам, только когда я использую неверный идентификатор объекта пользователя, он показывает то же сообщение об ошибке, что и ваше.
Если я использую идентификатор объекта другого пользователя (не идентификатор объекта пользователя для аутентификации), он будет отображаться ErrorAccessDenied
, потому что у него нет разрешения.
Если я использую идентификатор объекта, которого у пользователя нет в Azure AD (неверный идентификатор объекта), он покажет то же сообщение об ошибке, что и у вас. Поэтому, пожалуйста, проверьте, uuid
является ли указанный вами идентификатор объекта пользователя (показан на скриншоте ниже) в вашем Azure AD, и, пожалуйста, проверьте, правильно ли вы ввели формат идентификатора объекта в своем коде с помощью Console.WriteLine(object id)
Комментарии:
1. Вы тестировали с использованием http-запросов или с использованием библиотеки C #? Я чувствую, что библиотека работает некорректно (Microsoft. График. Auth, он все еще находится в предварительном просмотре, но в документе об этом не упоминается)
2. Привет @Saladino Я тестирую как http-запрос, так и библиотеку C #, все они работают нормально. Не могли бы вы перейти к своему azure ad на портале Azure и найти пользователя, проверить, имеет ли пользователь с указанным вами адресом электронной почты тот же идентификатор объекта
uuid
, что и упомянутый вами.3. @Saladino Я предполагаю
uuid
, что вы использовали в своем коде не то же самое с идентификатором объекта пользователя в ad.4. Мне придется передать это нашему администратору AAD, поскольку я не могу получить доступ к AAD никаким другим способом, кроме как с помощью приложения, предоставленного с идентификатором клиента и секретом. Но даже если это будет неправильный идентификатор, я понятия не имею, где я мог бы получить правильный, поскольку это единственный идентификатор, который я получаю при запросе данных комнаты. Это приложение должно работать динамически, поэтому жесткое кодирование списка идентификаторов — это не то, что я хочу.
5.@Saladino Хорошо, пожалуйста, обратитесь к своему администратору AAD и проверьте, совпадает ли идентификатор объекта пользователя с
uuid
. И если вы хотите получить идентификатор объекта пользователя, поскольку у вас есть электронная почта пользователя, вы можете получить всю информацию о пользователе с помощью graph apihttps://graph.microsoft.com/v1.0/users/{email}
. Идентификатор объекта пользователя должен бытьid
полем ответа этого api.