通过电子邮件地址查找用户
Find a User by Email Address
我正在尝试查明我的 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();
我对我的电子邮件地址进行编码的方式与我在获得所有用户时看到的对我的电子邮件地址进行编码的方式相同。如果甚至可以通过电子邮件地址查询的话,我觉得我很接近。
目前我尝试过的所有事情都是 return 400 或 404。有人知道是否可以通过电子邮件地址(登录名)查询吗?
编辑
关于类似的主题,我也在尝试查询以更改用户密码,但无济于事。我想如果我能让一个查询工作,我就能让它在另一个上工作。
看看 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 开始(获取所有用户),然后更新密码并最后过滤。
既然是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')";
我也在尝试通过 login/email 地址查找用户。
这是我的(经过混淆处理的 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
?
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}')
我正在尝试查明我的 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();
我对我的电子邮件地址进行编码的方式与我在获得所有用户时看到的对我的电子邮件地址进行编码的方式相同。如果甚至可以通过电子邮件地址查询的话,我觉得我很接近。
目前我尝试过的所有事情都是 return 400 或 404。有人知道是否可以通过电子邮件地址(登录名)查询吗?
编辑
关于类似的主题,我也在尝试查询以更改用户密码,但无济于事。我想如果我能让一个查询工作,我就能让它在另一个上工作。
看看 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 开始(获取所有用户),然后更新密码并最后过滤。
既然是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')";
我也在尝试通过 login/email 地址查找用户。
这是我的(经过混淆处理的 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
?
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}')