Azure active directory 如何获得“等价物”;“用户名”;使用MicrosoftGraph

Azure active directory 如何获得“等价物”;“用户名”;使用MicrosoftGraph,azure-active-directory,microsoft-graph-api,Azure Active Directory,Microsoft Graph Api,我希望从Microsoft Graph中获得Azure门户显示为用户名的相同值(如下所示): userPrincipalName已关闭,但对于来宾用户,它具有#EXT和下划线编码(例如,jim.oneil_outlook.com#EXT#@redacted.onmicrosoft.com) 邮件不是为会员用户填充的,所以我不能依赖它,尽管这似乎是我为客人想要的 更糟糕的是,我们确实有一个成员用户也有一个EXT地址(其中mail未填充,而userPrincipalName已编码),因此简单地根据

我希望从Microsoft Graph中获得Azure门户显示为用户名的相同值(如下所示):

userPrincipalName
已关闭,但对于来宾用户,它具有#EXT和下划线编码(例如,jim.oneil_outlook.com#EXT#@redacted.onmicrosoft.com)

邮件
不是为会员用户填充的,所以我不能依赖它,尽管这似乎是我为客人想要的

更糟糕的是,我们确实有一个成员用户也有一个EXT地址(其中
mail
未填充,而
userPrincipalName
已编码),因此简单地根据成员类型使用一个或另一个属性也是不正确的。对我来说,解码和解析
userPrincipalName
似乎既脆弱又笨拙

我希望从Microsoft Graph中获得Azure门户显示为用户名的相同值

根据object,使用microsoftgraph的“用户名”没有等价物

对我来说,对userPrincipalName进行解码和解析似乎既脆弱又笨拙

我不知道为什么对userPrincipalName进行解码和解析对您来说显得脆弱和笨拙。事实上,这是一种获取“用户名”的方法。我们可以很容易做到

如果可以使用C代码,您可以参考以下代码

if (userPrincipalName.Contains("#EXT#"))
 {
      userName = user.UserPrincipalName.Substring(0, userPrincipalName.IndexOf("#")).Replace('_', '@');
 }
 else
 {
    userName = user.UserPrincipalName;
 }
下面是整个演示代码

string graphResourceId = "https://graph.microsoft.com/";
string authority = "https://login.microsoftonline.com/{0}";
string tenantId = "tenant Id";
string clientId = "clientId";
string secret = "scret key";
authority = String.Format(authority, tenantId);
var graphserviceClient = new GraphServiceClient(
            new DelegateAuthenticationProvider(
                requestMessage =>
                {
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                    return Task.FromResult(0);
                }));

 var displayName = "xxxx";
 var users = graphserviceClient.Users.Request().Select(x =>new 
 {
     x.UserPrincipalName,
     x.DisplayName

 } ).Filter("DisplayName eq '" + displayName + "'").GetAsync().Result;
 var user = users.FirstOrDefault();
 string userName = string.Empty;
 string userPrincipalName = user.UserPrincipalName;
 if (userPrincipalName.Contains("#EXT#"))
 {
      userName = user.UserPrincipalName.Substring(0, userPrincipalName.IndexOf("#")).Replace('_', '@');
 }
 else
 {
    userName = user.UserPrincipalName;
 }

根据您的描述,您需要检索用户名。但是,Microsoft Graph仅提供
MailNickName
UserPrincipalName
mail

根据我的测试,对于这种情况,我们只能通过
UserPrincipalName
获取用户名


虽然有些用户的电子邮件地址中有EXT,但它们不包含
#
。因此,我们可以通过解析
userPrincipalName
来排除那些存在的用户,无论是否将
#

包含在您的示例中,您指的是Azure AD中的B2B用户。正如您在问题中所指出的,Azure AD中的B2B用户是不同的。在Azure AD中,B2B用户的userType属性值设置为“Guest”-而租户的本地帐户设置为“Managed”。因此,您可以使用一些逻辑来检查用户类型,例如在图中,以查看所有B2B用户,您可以对以下端点执行
GET
https://graph.microsoft.com/v1.0/users?$filter=userType eq'Guest'。然后你也可以做一个
if语句

var logonName = "";  # holder for the logon name of the user
if(user.userType === 'Guest'){
  logonName = user.mail
} 
else {
  logonName = user.userPrincipalName
}

简而言之,对于B2B用户,您需要该信息的
user.mail
属性

是的,我在问题中提到了这一点,但是userPrincipalName需要一些解码,我可以这样做,但我觉得我不应该这样做。这是目前B2B架构的一部分。因为来宾用户实际上只是指向该用户的主租户帐户的指针。这可能是一个很好的建议留给Azure广告本身?本质上,关注点是基于Azure AD B2B用户类型的体系结构,以及如何在B2B和托管用户之间以通用格式正确显示该信息。一些好的文档,任何有像#EXT#这样的神奇字符串的东西都是脆弱和笨拙的,IMHO。诚然,这些不太可能改变,但这种编码并不是理想情况下我不应该处理的。我知道您打算将其作为示例,但我想指出,对于像jim这样的电子邮件,这种代码仍然会失败_oneil@outlook.com. 这也可以解决,但是否有其他编码方案可能不明显?是的,只是示例代码。但是正如我提到的,目前还没有用户对象的此类属性。我们需要添加逻辑来处理属性。我从azure portal捕获了网络,发现有一个属性“
displayUserPrincipalName
”。它似乎代表Azure门户中的“用户名”。但是我在Microsoft用户对象中找不到它。我建议你把你的钱交给Azure团队。