使用Microsoft Graph通过userPrincipalName获取访客用户

9

我正在使用 Microsoft Graph 探索从我的应用访问 Azure Active Directory,直接使用 REST API(无需 SDK)。

根据文档,我可以通过 /users/{id | userPrincipalName} 使用用户的 iduserPrincipalName 检索用户信息。

确实可以正常工作,但对于来宾用户却不行。对于来宾用户,userPrincipalName 是类似于 name_originaldomain#EXT#@mydomain.onmicrosoft.com 的格式,尝试获取该用户会导致 404 Not Found 的错误。

这是我目前正在使用的代码:

graphClient = new HttpClient();
graphClient.BaseAddress = new Uri("https://graph.microsoft.com/v1.0/");
graphClient.DefaultRequestHeaders.Add("Authorization", $"{token.TokenType} {token.AccessToken}");

HttpRequestMessage request = new HttpRequestMessage(
    HttpMethod.Get,
    $"users/{Uri.EscapeUriString(username)}"
);

HttpResponseMessage response = await graphClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
    return await response.Content.ReadAsAsync<UserResult>();
}
// I am here with a 404

我有所不知或者做错了什么吗?

我知道我可以通过电子邮件检索用户,并且这是我目前为访客用户采取的解决方法,但我担心从UPN(我唯一拥有的信息)获取电子邮件在未来不是一个稳健的情况。 - Giorgio Di Nardo
2个回答

6
您需要对userPrincipalName进行URL编码。否则,您实际上传递的是name_originaldomain,因为#将其后面的所有内容都视为URI片段
尝试使用name_originaldomain%23EXT%23%40mydomain.onmicrosoft.com

2
我原本以为 Uri.EscapeUriString 可以解决问题,但结果发现应该使用 System.Net.WebUtility.UrlEncode。感谢 Marc。 - Giorgio Di Nardo

6

另一种方法是创建一个更大的查询,同时查询嘉宾用户的电子邮件地址(或在您的情况下,“name@originaldomain”),并且还查询mail属性。对于嘉宾用户,我们将mail属性设置为嘉宾的电子邮件地址。

../users?$filter=mail eq 'name@originaldomain'

希望这可以帮助到您,


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