【问题标题】:How to get user properties from Azure AD如何从 Azure AD 获取用户属性
【发布时间】:2018-01-23 14:25:52
【问题描述】:

我正在使用来自MS library 的标准 sn-p 从我的 azure AD 获取用户及其属性。但不幸的是我发现这个sn-p并没有得到用户拥有的所有属性,只得到他们的显示名,全名,姓氏,仅此而已,其他属性是null,但我需要获取用户拥有的所有属性。我已经在谷歌上搜索了很多这个问题,并且只找到了不适合我的 LDAP 的解决方案。

用户属性的 JSON 输出图像:

[{"Properties":{},"Id":null,"Display":null,"Department":null,"GivenName":"Example","Surname":"Example","UserPrincipalName":"Example@Example.com"},{"Properties":{},"Id":null,"Display":null,"Department":null,"GivenName":"Example","Surname":"Example","UserPrincipalName":"Example@Example.com"},{"Properties":{},"Id":null,"Display":null,"Department":null,"GivenName":"Example","Surname":"Example","UserPrincipalName":"Example@Example.com"},{"Properties":{},"Id":null,"Display":null,"Department":null,"GivenName":"Example","Surname":"Example","UserPrincipalName":"Example@Example.com"},{"Properties":{},"Id":null,"Display":null,"Department":null,"GivenName":"Example","Surname":"Example","UserPrincipalName":"Example@Example.com"},{"Properties":{},"Id":null,"Display":null,"Department":null,"GivenName":"Example","Surname":"Example","UserPrincipalName":"Example@Example.com"},

所以问题是,如何使用 C# 从 Azure AD 获取所有用户属性?

我的用户模型:

 public async Task<List<ResultsItem>> GetUsers(GraphServiceClient graphClient)
    {
        List<ResultsItem> items = new List<ResultsItem>();

        // Get users.
        IGraphServiceUsersCollectionPage users = await graphClient.Users.Request().GetAsync();

        // Populate the view model.
        if (users?.Count > 0)
        {
            foreach (User user in users)
            {

                // Filter out conference rooms.
                string displayName = user.DisplayName ?? "";
                if (!displayName.StartsWith("Conf Room"))
                {

                    // Get user properties.
                    items.Add(new ResultsItem
                    {
                        Mail = user.Mail,
                        Display = user.DisplayName,
                        Id = user.Id,
                        Department = user.Department,
                        GivenName = user.GivenName,
                        Surname = user.Surname,
                        UserPrincipalName = user.UserPrincipalName                           
                    });
                }
            }
        }
      var jsonEmployees = JsonConvert.SerializeObject(items); // Convert to JSON
      return items;
    }

【问题讨论】:

  • 请包含 JSON 作为代码而不是图像。

标签: c# azure active-directory


【解决方案1】:

根据您的描述,我注册了 AD v2.0 应用并使用 MSAL 通过 User.ReadUser.ReadBasic.All 检索访问令牌范围。获取用户时使用fiddler捕获网络轨迹,可以得到如下响应:

正如 Microsoft Graph List users 所述:

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

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

为了一个简单的方法,我只是使用Microsoft Graph Explorer并访问https://graph.microsoft.com/v1.0/users?$select=Department,Mail,Display,Id,GivenName,Surname,UserPrincipleName如下:

使用客户端库时,可以使用以下代码:

var users = await graphClient.Users.Request().Select("Department,Mail,Display,Id,GivenName,Surname,UserPrincipleName").GetAsync();

您可以按照Microsoft Graph .NET Client Library Overview 下的查询选项部分了解详细信息。

另外,你需要检查是否还有记录,并通过以下代码sn-p检索所有用户:

var userList = new List<User>();
IGraphServiceUsersCollectionPage pagedCollection = await graphClient.Users.Request().Select("Department,Mail,Display,Id,GivenName,Surname,UserPrincipleName").GetAsync();
if (pagedCollection != null)
{
    do
    {
        List<User> usersList = pagedCollection.CurrentPage.ToList();
        foreach (var user in usersList)
        {
            userList.Add(user);
        }
        pagedCollection = await pagedCollection.NextPageRequest.GetAsync();
    } while (pagedCollection != null);
}

更新:

我利用Microsoft Graph Snippets Sample for ASP.NET 4.6 示例注册了我的AD V2.0 应用程序,并替换了我的web.config 文件下的ida:AppIdida:AppSecret 设置。它可以在我这边工作如下:

使用提琴手,我可以捕获https://graph.microsoft.com/v1.0/users 的网络跟踪,它可以正确返回用户属性。我建议您调试应用程序并在调用 await graphClient.Users.Request().GetAsync(); 后检查结果,并在迭代 users 集合时检查 user 实例的属性。

【讨论】:

  • 我已经尝试使用.Select,但没有成功。我试图添加你的代码 sn-p,它对我也不起作用,抛出下一个错误:Unrecognized query argument specified version
  • 我还尝试创建 C# 请求以绘制无效的图形 api。
  • 我使用了Microsoft.Graph v1.7.0。您是否尝试过利用Microsoft Graph Explorer 快速检查您的问题?
  • 是的,MS Graph 浏览器返回了所有没有null 的属性。
  • 我做了一些测试,你可以参考我答案的更新部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多