通过电子邮件地址查找用户

Posted

技术标签:

【中文标题】通过电子邮件地址查找用户【英文标题】:Find a User by Email Address 【发布时间】:2016-09-16 14:31:45 【问题描述】:

我正在尝试确定我的 Azure AD B2C 目录中是否已使用电子邮件地址。

var token = await this.GetTokenAsync();

var client = new HttpClient();

var id = HttpUtility.UrlEncode("adrian_mydomain.com#EXT#@xxxxxxxxx.onmicrosoft.com");
////var id = HttpUtility.UrlEncode("adrian@mydomain.com"); // This also fails.
////var id = HttpUtility.UrlEncode("adrian_mydomain.com#EXT#"); // This also fails.
////var id = "xxxx-xxxx-xxxxxxxx-xxxxxxxxxx"; // This also fails (user object id).

var resource = $"this.graphConfig.GraphUri/this.graphConfig.Tenant/users/id?api-version=1.6";
//// This line below works, it returns all the users, so I do know the token is good and the resource URI is valid, etc.
////var resource = $"this.graphConfig.GraphUri/this.graphConfig.Tenant/users?api-version=1.6";

var request = new HttpRequestMessage(HttpMethod.Get, resource);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

var response = await client.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();

我对我的电子邮件地址进行编码的方式与我在获得所有用户时看到我的电子邮件地址编码的方式相同。如果可以通过电子邮件地址查询的话,我感觉我已经很接近了。

目前我尝试过的所有事情都返回 400 或 404。有谁知道是否可以通过电子邮件地址(登录名)查询?

编辑

在类似的主题上,我也在尝试更改用户密码的查询,但无济于事。我想如果我可以让查询为一个工作,我可以让它在另一个工作。

【问题讨论】:

【参考方案1】:

看看 B2C.exe 的实现,首先让它工作: https://azure.microsoft.com/nl-nl/documentation/articles/active-directory-b2c-devquickstarts-graph-dotnet/

您会注意到,GUIDUPN 引用了用户,而不是电子邮件! 电子邮件在集合中signInNames

要查询电子邮件地址,您需要指定一个过滤器: https://msdn.microsoft.com/en-us/library/azure/ad/graph/api/users-operations#GetUsers

从 GetUsers 开始(获取所有用户),然后更新密码并最后过滤。

【讨论】:

谢谢,我没有将它包含在我的问题中,但我已经尝试使用用户对象并且也没有得到任何乐趣。但是,我可以成功检索所有用户的列表。 可以添加用户吗?很可能是您发送的 json 有问题,它是什么样的? 是的,我可以很好地添加用户。我准确地发送了所需的内容,并且用户创建得很好。我还可以为所有用户发出 GET 请求。但仍然无法检索单个用户的详细信息。 过滤器工作正常,尽管 API 参考的其他部分似乎损坏了。感谢您的帮助。【参考方案2】:

由于是odata,所以可以使用odata语法进行查询。 Odata语法here

var queryString = HttpUtility.ParseQueryString(string.Empty);
queryString["api-version"] = "1.6";
queryString["$filter"] = "signInNames/any(x:x/value eq 'paule@test.in')";

string url = "https://graph.windows.net/" + tenant + "/users"+ "?" + queryString;

$filter 成功了

queryString["$filter"] = "signInNames/any(x:x/value eq 'paule@test.co.uk')";

【讨论】:

【参考方案3】:

我也在尝试通过用户的登录名/电子邮件地址来查找用户。

这是我的(经过混淆的 XXXX)查询字符串:

"https://graph.windows.net/XXXX.onmicrosoft.com/users?api-version=1.6&$filter=signInNames/any(x: x/value eq 'dd.rrr@XXXX.com')"

它没有错误,但没有找到用户(我知道它存在,因为 GetAllUsers 找到了它)。

但是,查看用户详细信息,我可以看到:

"showInAddressList": null,
"signInNames": [],
"sipProxyAddress": null,

这是否可以作为搜索为什么不起作用的线索?

用户怎么可能没有signInName

【讨论】:

【参考方案4】:

signInNames 不是存储电子邮件的唯一位置。它也可以是 userPrincipalName 或 otherMails。您需要使用以下查询来搜索电子邮件的所有可能字段。

/users?api-version=1.6&$filter=otherMails/any(x:x eq 'email') or userPrincipalName eq 'email' or signInNames/any(x:x/value eq 'email')

【讨论】:

以上是关于通过电子邮件地址查找用户的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户的电子邮件/电话/地址上传到Google Analytics?

如何在 C# 中使用 AD 组名称查找 Active Directory 组电子邮件地址

用户在 Web 应用程序中注册后通过电子邮件发送用户名和密码

用户在 Web 应用程序中注册后通过电子邮件发送用户名和密码

如何“通过电子邮件查找我”

电子邮件验证 MX 查找