На самом деле у меня есть два вопроса, которые могут быть связаны:
Вопрос 1: Почему личный адрес электронной почты пользователя отображается на портале Azure как основное имя пользователя?
Вопрос 2: Как искать пользователя по его личному адресу электронной почты?
Адрес электронной почты, который я буду искать, используется в качестве имени для входа, поэтому я ожидаю, что он должен появиться в таком свойстве, как signInNames
как упоминается ниже.
Шаги для воспроизведения:
Войдите в Azure портал, посмотрите на случайного пользователя и обратите внимание на его основное имя пользователя. Обратите внимание, что он отображается в формате личного адреса электронной почты (joe@somedomain.com). Скопируйте идентификатор объекта пользователя.
В коде создайте новый GraphServiceClient
и получите пользователя по идентификатору объекта, используя идентификатор объекта, скопированный на шаге выше.
GraphServiceClient client = GetGraphServiceClient();
User user = await client.Users[userID].Request().GetAsync();
В User объект, который возвращается, обратите внимание, что значение UserPrincipalName отличается от того, что показано на портале Azure, как указано в первом шаге. Вместо этого ему назначен идентификатор: cpim_96fe-48b5-88a2-9ac960a6bdab@mydomain.onmicrosoft.com.
Попытка найти пользователя, используя личный адрес электронной почты См. Также :
GraphServiceClient client = GetGraphServiceClient();
IGraphServiceUsersCollectionPage users = await client.Users.Request().Filter("userPrincipalName eq 'joe@somedomain.com'").GetAsync(); // Count = 0
IGraphServiceUsersCollectionPage users = await client.Users.Request().Filter("mail eq 'joe@somedomain.com'").GetAsync(); // Count = 0
В соответствии с рекомендациями this ответ , это тоже не работает:
IGraphServiceUsersCollectionPage users3 = await client.Users.Request().Filter("signInNames/any(x:x/value eq 'joe@somedomain.com')").GetAsync(); // error Filter not supported.
My Azure Приложение имеет разрешение User.ReadWrite.All. Личный адрес электронной почты не отображается как значение свойства для любого объекта, который я извлекаю.
EDIT
В ответ на отправленный ответ здесь Я попробовал этот код:
// Exact call to graph:
https://graph.microsoft.com/beta/users?$filter=otherMails/any(id:id%20eq%20'my.name@outlook.com')
Error message:
System.NotSupportedException : The collection type 'Microsoft.Graph.IUserAppRoleAssignmentsCollectionPage' on 'Microsoft.Graph.User.AppRoleAssignments' is not supported.
[Question regarding above error](https://stackoverflow.com/questions/62776361/how-to-use-graph-explorer-sdk)
[Instruction to use GraphClient](https://docs.microsoft.com/en-us/graph/sdks/create-client?tabs=CS)
Используя GraphServiceClient
, вот как я реализовал ваш ответ. В обоих случаях вызов графика возвращает пользователей, однако свойства для пользователей не заполняются. У моего приложения есть разрешения User.ReadWrite.All, User.ManageIdentities.All, Domain.ReadWrite.All. Это проблема с разрешениями?
public async Task<User> GetUserByEmailAddress2(string email)
{
GraphServiceClient client = GetGraphServiceClient();
IGraphServiceUsersCollectionPage users = await client.Users.Request().Filter($"otherMails/any(id:id eq '{email}')").GetAsync();
var nonnullusers = users.Where(x => x.OtherMails?.Any() ?? false).ToList(); // count = 0
users = await client.Users.Request().Filter($"identities/any(id:id/issuer eq 'LeaderAnalytics.onmicrosoft.com' and id/issuerAssignedId eq '{email}')").GetAsync();
nonnullusers = users.Where(x => x.Id == email).ToList(); // count = 0
return users[0];
}