【问题标题】:Microsoft Graph API: returning only one user out of total 13 usersMicrosoft Graph API:仅返回 13 个用户中的一个用户
【发布时间】:2021-11-24 21:58:19
【问题描述】:

在我的UWP 应用程序中,我使用的是Microsoft Graph SDK。我的 Azure 帐户共有 13 个用户,我想使用以下查询在我的 UWP 应用程序中显示这些用户。但是查询只返回一个(登录用户)。即使我以Global admin 登录时也会发生这种情况。此外,用户的userType显示为Null

var users = await graphClient.Users.Request()
    .Select("displayName, userPrincipalName, userType")
    .GetAsync();

在我的应用程序中授权ScopesUser.Read User.Read.All

显示所有用户列表的 Azure 门户

注意UWP 中的上述查询仅返回其中一个用户(登录用户)

Registered App 在 Azure 中的 API 权限

更新

回答用户@Allen Wu的询问:

a) 我已经安装了以下 NuGet 软件包:

Install-Package Microsoft.Toolkit.Uwp.Ui.Controls -Version 6.0.0
Install-Package Microsoft.Toolkit.Uwp.Ui.Controls.DataGrid -Version 6.0.0
Install-Package Microsoft.Toolkit.Graph.Controls -IncludePrerelease

我正在使用将变量 graphClient 设置为 ProviderManager.Instance.GlobalProvider.Graph;

b) 我已经使用倒数第三个帐户(Microsoft hotmail 帐户,如图 1 所示)和倒数第二个帐户(Microsoft Outlook 帐户)测试了应用程序,这两个帐户我都分配了全局管理员角色.但它们不是 Azure AD 帐户。

【问题讨论】:

  • 请分享更多代码,包括如何获得authProvidergraphClient。那么使用其他帐户登录呢?还是只返回登录的用户?
  • @AllenWu 为了回答您的询问,我在帖子中添加了 UPDATE 部分。看看能不能帮上忙。谢谢。

标签: azure uwp azure-active-directory microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

您应该提供您的代码,以便我修改或指出不正确的部分。

但无论如何我找到了原因。

MicrosofthotmailAccount和MicrosoftOutlook这两个账号实际上是MSA(微软个人账号)。

虽然他们已作为访客用户添加到您的租户中,但如果您的身份验证端点为common,则此帐户将被视为个人帐户,而不是此租户下的访客用户。请参阅参考here。在您的代码中,您默认使用common,因此用户被视为MSA,它只能获取自己的信息。

所以你需要在请求中指定租户id。我不确定您如何生成graphClient。不过可以参考官方文档Authorization code providerList users example

但还是记得修改WithAuthority

这里有一个例子:

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithRedirectUri(redirectUri)
    .WithAuthority("https://login.microsoftonline.com/{tenant id}/v2.0")
    .WithClientSecret(clientSecret) // or .WithCertificate(certificate)
    .Build();

AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(confidentialClientApplication, scopes);

GraphServiceClient graphClient = new GraphServiceClient(authProvider);

var users = await graphClient.Users
    .Request()
    .GetAsync();

【讨论】:

  • 这是一个UWP 应用程序,我使用ProviderManager Class 来设置graphClient = ProviderManager.Instance.GlobalProvider.Graph;
  • @nam 我查看了uwp sample,发现它正在使用providers:InteractiveProviderBehavior 让您使用身份验证代码流登录。但我们只能修改客户端 ID 和范围。它使用common作为底层的权限。如果要修改租户ID的权限,我认为您可能需要使用MSAL实现自定义提供程序。
  • @nam 一种解决方法是使用 MSAL 在 UWP 中完成授权。这里有一个示例:docs.microsoft.com/en-us/azure/active-directory/develop/…。您可以在代码中指定租户 ID。请注意,此示例使用 Microsoft.Graph 而不是 ProviderManager.Instance.GlobalProvider.Graph
  • 我从上面的Respone 解决了这一行的问题:The two accounts Microsoft hotmail Account and Microsoft Outlook account are actually MSA (Microsoft personal account).。你是对的。这就是问题所在。当我使用也具有全局管理员角色的 Azure AD 帐户登录时。它显示了所有用户(不仅仅是他登录的用户 - 因为它正在使用 hotmail 和 Outlook 帐户进行操作,即使他们也分配了全局管理员角色)。谢谢你帮助我。我也喜欢您在上面的最后评论中提出的解决方法建议,我也应该尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多