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

8

我正在尝试确定我的 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。是否有人知道是否可以按电子邮件地址(登录名)进行查询?
编辑:
类似的主题上,我也尝试了更改用户密码的查询,但无济于事。我认为如果我可以使一个查询成功,我就可以使另一个查询成功。
4个回答

7

由于这是一个 OData,您可以使用 OData 语法进行查询。OData 语法在此

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')";


5

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}')


5
请查看B2C.exe的实现,首先让它工作起来:https://azure.microsoft.com/nl-nl/documentation/articles/active-directory-b2c-devquickstarts-graph-dotnet/
请注意,用户是通过GUID或UPN引用的,而不是电子邮件!电子邮件在signInNames集合中。
为了按电子邮件地址查询,您需要指定过滤器:https://msdn.microsoft.com/en-us/library/azure/ad/graph/api/users-operations#GetUsers
从GetUsers开始(获取所有用户),然后更新密码,最后使用过滤器。

谢谢,我没有在我的问题中包含它,但我也尝试使用用户对象并没有成功。不过,我可以成功地检索到所有用户的列表。 - Adrian Thompson Phillips
你能添加用户吗?很可能是你发送的 JSON 有问题,它长什么样子? - Erik Oppedijk
是的,我可以很好地添加用户。我发送了所需的内容,用户也被成功创建了。我也可以对所有用户进行GET请求。但仍然无法检索单个用户的详细信息。 - Adrian Thompson Phillips
过滤器似乎工作正常,尽管API参考文档的其他部分似乎有问题。感谢您的帮助。 - Adrian Thompson Phillips

0

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

这是我的(已混淆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


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