从 Web Api 调用 Graph Api 不会返回所有用户数据

Posted

技术标签:

【中文标题】从 Web Api 调用 Graph Api 不会返回所有用户数据【英文标题】:Calling Graph Api from Web Api doesn't return all user data 【发布时间】:2021-12-12 16:29:31 【问题描述】:

在我的 ASP.NET Core Web Api 中,我尝试调用 Graph API 来检索组织中其他用户的数据。我正在使用代表流程。引导令牌是从 SPA 客户端代码传入的。

在启动代码中,我有:

builder.Services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph("https://graph.microsoft.com/beta", "user.read user.readbasic.all profile")
    .AddInMemoryTokenCaches();

在Controller的Action中,我有:

_graphServiceClient.Users.Request()
            .Filter($"mail eq 'someuser@myorg.com'")
            .Select((user) => new 
                DisplayName = user.DisplayName,
                City = user.City,
                Country = user.Country,
                BusinessPhones = user.BusinessPhones
            )
            .Request()
            .GetAsync();

但是,在运行时,我只能得到 DisplayName 值。我不明白 City、Country 或 BusinessPhones 的值。他们是null

当我在 Graph Explorer 中尝试相同的查询时,我看到了所有这些查询的值。

我错过了什么?

【问题讨论】:

您有什么理由使用 beta API 而不是 1.0 API? 你在api权限中启用profile了吗? 【参考方案1】:

首先,你的代码 sn-p 有一个错误,你写了 2 .Request(),你应该删除一个。

您使用的任何流程都在生成访问令牌,以便您可以访问 api,因此当您从 api 获得正确的数据时,这意味着您在使用流程时具有正确的设置,所以我认为如果有任何问题,它应该位于调用api的部分。然后我在我身边做了一些测试。

请问您是否可以直接调用api,您可以获得City, Country and BUsinessPhones这3个属性的值吗?根据我的测试,当我调用 api 时,我可以得到如下截图所示的响应,默认情况下它是 null

https://graph.microsoft.com/beta/users?$filter=maileq 'tinywang@xxx.onmicrosoft.com'&$select=mail,city,country,DisplayName,BusinessPhones,userType,usageLocation

当我跟随this tutorial通过sdk调用api时,我得到了同样的结果:

我的想法是先检查调用 api 的响应,如果我们找不到问题,那么您能否提供您遵循的教程以帮助重现问题。

【讨论】:

以上是关于从 Web Api 调用 Graph Api 不会返回所有用户数据的主要内容,如果未能解决你的问题,请参考以下文章

AAD Graph API在调用AcquireTokenAsync后返回404,但在调用AcquireTokenSilentAsync后不返回404

OneNote Graph API不会返回新页面

从 Facebook Graph-API 获取用户图像

从 Fragment 类调用 Web 服务(API)的正确方法

从另一个 Web api 调用 Web api

不使用用户登录的 Facebook Graph API 调用