ActiveDirectoryClient выбрасывает как Microsoft.Data.OData.ODataErrorException, так и System.Data.Services.Client.DataServiceQueryException - PullRequest
0 голосов
/ 12 июня 2018

Я играл с ActiveDirectoryClient для вызова API-интерфейсов ADGraph и обнаружил, что он генерирует System.Data.Services.Client.DataServiceQueryException на моем локальном компьютере (обернутый в исключение), но этовыбрасывая Microsoft.Data.OData.ODataErrorException в одну из наших развернутых служб.

Я не могу найти ни одной документации, касающейся того, какие исключения ActiveDirectoryClient предполагается выдавать, и как мы должны обрабатывать исключенияучитывая это ошибочное поведение.

Я посмотрел на декомпилированный код, и кажется, что это связано с конфликтом пространства имен между System.Data.Services.Client против Microsoft.Data.Services.Client , но я не уверен на 100%.

Может кто-нибудь помочь мне понять, какой тип исключений должен генерировать ActiveDirectoryClient, и почему это вызывает различные типы исключений в зависимости отenvironment?

Вот пример трассировки стека между двумя:

Microsoft.Data.OData.ODataErrorException: Insufficient privileges to complete the operation. ---> System.Data.Services.Client.DataServiceQueryException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: {"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."}}}
   at System.Data.Services.Client.BaseAsyncResult.EndExecute[T](Object source, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](Object source, String method, IAsyncResult asyncResult)
   --- End of inner exception stack trace ---
   at System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](Object source, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.DataServiceRequest.EndExecute[TElement](Object source, DataServiceContext context, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.DataServiceQuery`1.EndExecute(IAsyncResult asyncResult)
   at Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.<>c__DisplayClass4c`2.<ExecuteAsync>b__4a(IAsyncResult r)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

против

System.Data.Services.Client.DataServiceQueryException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: {"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."},"requestId":"babeee64-a5b1-4b37-9124-a3e18cc304fb","date":"2018-06-12T04:22:53"}}
   at System.Data.Services.Client.BaseAsyncResult.EndExecute[T](Object source, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](Object source, String method, IAsyncResult asyncResult)
   --- End of inner exception stack trace ---
   at System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](Object source, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.DataServiceRequest.EndExecute[TElement](Object source, DataServiceContext context, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.DataServiceQuery`1.EndExecute(IAsyncResult asyncResult)
   at Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.<>c__DisplayClass4c`2.<ExecuteAsync>b__4a(IAsyncResult r)

1 Ответ

0 голосов
/ 15 июня 2018

В обоих ваших исключениях есть очень четкое сообщение:

{"lang":"en","value":"Insufficient privileges to complete the operation."}

У вас недостаточно прав для завершения операции.Так что обратитесь к API графа относительно операции, которую вы пытаетесь выполнить, каких привилегий она требует, и если вы предоставили их для своего приложения.

Также обратите внимание, что если вы используете только поток учетных данных клиента, вы не сможете удалить какие-либо объекты из вашего каталога.Приложениям (субъектам службы) запрещено удалять что-либо.Вы также можете преодолеть это, но вы не хотите этого делать.Способ сделать приложение способным к удалению объектов, это сделать его администратором компании.Это означает, что любой, кто получил ваши учетные данные клиента (client_id, client_secret), будет иметь полный контроль над вашей Azure AD.И ты не хочешь этого.

...