从Microsoft Graph获取所有用户属性

27
我们有一个使用本地AD获取用户信息的应用程序。一些客户想要转移到云端并使用Azure AD。我们扩展了应用程序通过owin登录用户,现在我们通过Microsoft Graph获取用户。
但是从Microsoft Graph中,我们无法获取完整的用户配置文件。我们希望获取所有用户属性,而不仅仅是基本属性。
var client = new RestClient(string.Format("https://graph.microsoft.com/v1.0/users/{0}", userEmail));
request = new RestRequest();
request.Method = Method.GET;
request.AddHeader("Authorization", _token.Token);
var reponse = client.Execute(request);

这只是提供了一些信息,例如我没有从中得到“Department”。 在Azure中是否可以配置应该返回什么内容,如果可以的话,应该在哪里配置?或者我需要使用除/users/之外的其他内容吗?

不同的客户可能有不同的特殊属性需要获取。因此,最好的解决方案是拥有一个端点来调用并获取所有内容,包括在Azure AD中不标准的特殊属性。然后我可以在我的那边解析它。这个可行吗?

该应用程序具有读取基本和完整配置文件的权限。我需要更多的东西吗?

7个回答

33
这是 Graph API 的正常行为,参见此处的文档和这个摘录:

默认情况下,只返回有限的属性(businessPhones, displayName, givenName, id, jobTitle, mail, mobilePhone, officeLocation, preferredLanguage, surname,userPrincipalName)。

要返回替代属性集,必须使用 OData $select 查询参数指定所需的用户属性集。例如,要返回 displayName、givenName 和 postalCode,您将在查询中添加以下内容:$select=displayName,givenName,postalCode

您必须在选择中指定所有字段,因为$select=* 仅在 Graph API 实现中输出键字段。

因此,您将无法获取您请求的变量自定义字段。

有关 User 字段的更多信息,请查看此处的内容


1
如果您知道字段名称,就可以获取它们。您只需请求“所有字段”而不提供它们的名称即可。 - Nicolas R
1
简而言之(尼古拉斯的意思是)-对于用户实体类型,标准GET操作只返回基本/默认属性集。如果您需要更多的属性集,则需要使用$select显式地请求所需的属性集。不支持$select=*。如果您正在寻找此功能,请在此处的UserVoice上请求:https://officespdev.uservoice.com/forums/224641-feature-requests-and-feedback/category/101632-microsoft-graph-o365-rest-apis - Dan Kershaw - MSFT
你能获取基本字段加上特定字段吗?我注意到当使用$select时,我只会得到我请求的字段。 - Mike
@Mike,你的问题不够清晰。正如评论中已经说过的那样,如果你想获取所有字段(基础、特定)但不知道字段名称,那是不可能的。如果你知道所有的基础和特定字段,只需提供它们即可。 - Nicolas R
@NicolasR - 抱歉如果我表达不清楚。我的意思是,除了原始提供的基本列表(如is、businessPhones等),你能否获取指定的$select字段? - Mike
显示剩余6条评论

7
User user = await graphServiceClient
    .Users[emailId]
    .Request()
    .Select(aadUser => new
    {
        aadUser.Id,
        aadUser.UserPrincipalName,
        aadUser.DisplayName,
        aadUser.GivenName,
        aadUser.Surname,
        aadUser.City,
        aadUser.MailNickname,
        aadUser.UserType
    })
    .GetAsync()
    .ConfigureAwait(false);

3
虽然这段代码可能解决了问题,但是包括解释这段代码如何解决问题以及为什么能解决问题,会大大提高您的帖子质量,并且可能会得到更多的点赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的回答,添加解释并指出适用的限制和假设条件。 - David Buck

3

使用Microsoft Graph Explorer,我已经能够找到用户的所有可用属性:

  1. 进入“组”
  2. 选择“列出我的组织中的所有组”
  3. 更改查询以按您所知道的组筛选并展开成员https://graph.microsoft.com/v1.0/groups?$filter=mail eq 'aGroup@company.com'&$expand=members

现在,您将看到所有用户的可用属性。


2
function getGraphDataAdvanced($authToken, $urlGraph){
    $url = $urlGraph + '&$count=true'

    $data = (Invoke-RestMethod -Headers @{
        Authorization = "Bearer $($authToken)"
        ConsistencyLevel = "eventual"
    } -Uri $url -Method Get)

    $dataList = @()
    $dataList += $data.value

    $url = $data.'@Odata.NextLink'

    while ($null -ne $url){
        Write-Warning 'Retreiving Next Page'

        $data = (Invoke-RestMethod -Headers @{
            Authorization = "Bearer $($authToken)"
            ConsistencyLevel = "eventual"
        } -Uri $url -Method Get)

        $dataList += $data.value
        $url = $data.'@Odata.NextLink'
    }
    return $dataList
}

getGraphDataAdvanced $authToken 'https://graph.microsoft.com/beta/users? $expand=extensions'

2

正如NicolasR所说,您必须使用"$select"参数列出要检索的所有字段;如果您想要检索自定义字段,则可以将它们添加到先前的参数中(如果您知道它们的名称),或者您可以使用"$expand=extensions"。


"$expand=extensions" 我添加了这个参数并没有得到任何不同的东西,能否请您详细解释一下呢? :D - Chop Labalagun
@ChopLabalagun,你可以参考这个问题,它应该能解决你的疑问 ;) https://dev59.com/O1cO5IYBdhLWcg3wXgfh - Nicolò Alabastro

0

我一直在尝试通过Powershell MSGraph cmdlets获取所有Azure AD对象的属性,但是它会在控制台右侧截断。

我发现Format-Custom会触发一个巨大的、按字母顺序排列的、缩进和括号列表中的(显然)所有对象属性。

Get-MgUser -filter "startswith(userprincipalname, 'username')" | format-custom

在Azure AD中,一个新创建且未使用的用户帐户的格式化属性有13217行之长。


0

'AzureAD' 模块可以通过 Get-AzureADUser -ObjectId unique.identifier@domain.com | fl 命令获取该用户的所有信息。这是一种非常快速和简单的方法,可以轻松查看已设置和未设置的内容。


1
嗨,虽然这确实有效,但这不是一个好的答案,因为不幸的是,AzureAD PowerShell模块已被标记为弃用,并将在未来被移除。它的替代品是Microsoft Graph Powershell SDK。 - Harrison Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接