MS Graph:Azure AD - 如何在用户列表中找到源列?

MS Graph: Azure AD - How to find the Source column in the users list?

我正在使用 Microsoft Graph 检索使用 Azure AD 的组织中的用户列表。当我以全局管理员身份登录 Azure Portal 并单击 Azure AD-->Users 时,它会显示如下用户列表,其中最后一列(以红色显示)是 Source 列:

问题:如何从list of users? By default, only a limited set of properties are returned(businessPhones,displayName,givenNameidjobTitlemailmobilePhoneofficeLocationpreferredLanguagesurnameuserPrincipalName).

据我所知,图 api 的响应中没有字段 source。我们可以看到这个page中user的所有属性,不存在属性source.

Azure 门户请求另一个 api 但不是图形 api(列出用户)来显示源。

顺便说一下,graph api list user(v1.0) 只显示了几个字段。要显示更多字段,可以在api中使用$select(如https://graph.microsoft.com/v1.0/users?$select=displayName,userType)。如果使用 graph api list user(beta),它将显示用户的所有字段。

希望对你有帮助~

如果你还没有使用过它,我会查看图形资源管理器 https://developer.microsoft.com/en-us/graph/graph-explorer

如果我不得不猜测它是一个基于 userPrincipalName 的动态列。如果用户来自外部系统,userPrincipalName 中将包含#EXT#。我会看一下,看看它们是否有什么不同。

我正在查看端点 https://graph.microsoft.com/v1.0/users

正如 Hury 提到的评论,您可以使用 userType 和 externalUserState 来确定同一件事。

如果我在 C# 中这样做(这是凭记忆,如果有错字,请见谅)

public string Source { 
   get {
      return UserPrincipalName.Contains("#EXT#")?"Microsoft Account":"Azure Active Directory";
   }
}

对于更复杂的处理

private string _source = null;
public string Source _source??(_source=GenerateSource());
}

protected string GenerateSource(){
   return UserPrincipalName.Contains("#EXT#")?"Microsoft Account":"Azure Active Directory";
}

如果我使用的代码类似于可以在此处找到的代码 我会把它作为扩展class(没有从记忆中测试,但我应该接近)


public static class UserExtension{
    
    public static UserSource(this User user){
        var userTypeUpper = _user.UserType.ToUpperCase();
        var userPrincipalNameUpper = user.UserPrincipalName.ToUpperCase();
        var externalUserStateUpper = user.ExternalUserState.ToUpperCase();
        
        return (_user.UserType == "MEMBER" && userPrincipalNameUpper.Contains("#EXT#") == false) ? "Azure Active Directory" :
                    (userTypeUpper == "MEMBER" && userPrincipalNameUpper.Contains("#EXT#")) ? "Microsoft Account" :
                    (userTypeUpper == "GUEST" && externalUserStateUpper == "ACCEPTED") ? "External Azure Active Directory" :
                    (userTypeUpper == "GUEST" && externalUserStateUpper == "PENDINGACCEPTANCE") ? "Invited user" : "Unknown";
    }
    
}

//sample code using it

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

List<User> lstUsers = (List<User>)users.CurrentPage.ToList();

var source = lstUsers.First().UserSource()