Azure active directory ActiveDirectoryClient同时引发Microsoft.Data.OData.ODataErrorException和System.Data.Services.Client.DataServiceQueryException

Azure active directory ActiveDirectoryClient同时引发Microsoft.Data.OData.ODataErrorException和System.Data.Services.Client.DataServiceQueryException,azure-active-directory,azure-ad-graph-api,Azure Active Directory,Azure Ad Graph Api,我使用ActiveDirectoryClient调用ADGraph API,发现它在本地机器上抛出System.Data.Services.Client.DataServiceQueryException(包装在异常中),但它在我们部署的一个服务上抛出Microsoft.Data.OData.ODataErrorException 我找不到任何关于ActiveDirectoryClient应该抛出什么异常的文档,以及考虑到这种不稳定的行为,我们应该如何处理异常 我查看了反编译的代码,似乎这是由于

我使用ActiveDirectoryClient调用ADGraph API,发现它在本地机器上抛出System.Data.Services.Client.DataServiceQueryException(包装在异常中),但它在我们部署的一个服务上抛出Microsoft.Data.OData.ODataErrorException

我找不到任何关于ActiveDirectoryClient应该抛出什么异常的文档,以及考虑到这种不稳定的行为,我们应该如何处理异常

我查看了反编译的代码,似乎这是由于System.Data.Services.ClientMicrosoft.Data.Services.Client之间的名称空间冲突造成的,但我不能100%确定

有谁能帮我理解ActiveDirectoryClient应该抛出哪种类型的异常,以及为什么会根据环境抛出不同类型的异常

以下是两个系统之间的stacktrace示例:

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)
Microsoft.Data.OData.ODataErrorException:权限不足,无法完成操作。-->System.Data.Services.Client.DataServiceQueryException:处理此请求时出错。-->System.Data.Services.Client.DataServiceClientException:{“odata.error”:{“code”:“Authorization_RequestDenied”,“message”:{“lang”:“en”,“value”:“权限不足,无法完成操作。”}}
位于System.Data.Services.Client.BaseAsyncResult.EndExecute[T](对象源,字符串方法,IAsyncResult asyncResult)
在System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](对象源,字符串方法,IAsyncResult asyncResult)
---内部异常堆栈跟踪的结束---
在System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](对象源,字符串方法,IAsyncResult asyncResult)
在System.Data.Services.Client.DataServiceRequest.EndExecute[TElement](对象源,DataServiceContext上下文,字符串方法,IAsyncResult asyncResult)
位于System.Data.Services.Client.DataServiceQuery`1.EndExecute(IAsyncResult asyncResult)
在Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.c__DisplayClass4c`2.b__4a(IAsyncResult r)
在System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar、Func`2 endFunction、Action`1 endAction、Task`1 Promission、Boolean requiresSynchronization)
vs

System.Data.Services.Client.DataServiceQueryException:处理此请求时出错。-->System.Data.Services.Client.DataServiceClient异常:{“odata.error”:{“code”:“Authorization_RequestDenied”,“message”:{“lang”:“en”,“value”:“完成操作的权限不足”。},“requestId”:“Babee64-a5b1-4b37-9124-a3e18cc304fb”,“date”:“2018-06-12T04:22:53”}
位于System.Data.Services.Client.BaseAsyncResult.EndExecute[T](对象源,字符串方法,IAsyncResult asyncResult)
在System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](对象源,字符串方法,IAsyncResult asyncResult)
---内部异常堆栈跟踪的结束---
在System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](对象源,字符串方法,IAsyncResult asyncResult)
在System.Data.Services.Client.DataServiceRequest.EndExecute[TElement](对象源,DataServiceContext上下文,字符串方法,IAsyncResult asyncResult)
位于System.Data.Services.Client.DataServiceQuery`1.EndExecute(IAsyncResult asyncResult)
在Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.c__DisplayClass4c`2.b__4a(IAsyncResult r)

在两个例外中都有非常明确的信息:

{“lang”:“en”,“value”:“权限不足,无法完成操作。”}

您没有足够的权限来完成该操作。因此,请参考graph API,了解您尝试完成的操作、它需要什么特权以及您是否已将这些特权授予应用程序


还要注意,如果您仅使用客户端凭据流,则无法从目录中删除任何对象。不允许应用程序(服务主体)删除任何内容。你也可以克服这一点,但你不想这样做。使应用程序能够删除对象的方法是使其成为公司管理员。这意味着,任何获得你的客户端凭据(客户端id、客户端机密)的人都将完全控制你的Azure广告。你不希望这样。

我也在搜索这个答案,值得注意的是DataServiceQueryException的InnerException有一条JSON消息,其中包含odata.error。也许它默默地试图将其反序列化为ODataErrorException,但失败了。你发现了吗?没有,我只是不得不处理这两种类型的异常:(类似地,我现在将消息反序列化为ODataError并重试。不漂亮。我只是在upn(GetUser)查询用户时才看到这个。我依赖于其他查询引发的ODataErrorException-您是否全面看到了这一点?如果没有,您的查询的性质是什么?感谢您的响应。我进行查询是为了获取用户的角色,并获取租户的SubscribedKUS。这仅在某些环境中发生(无法在本地机器上重新编程,但会在已部署的机器上发生),因此我不确定这里的核心问题是什么。。。
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)