Microsoft Graph: как найти пользователя по личному адресу электронной почты? - PullRequest
0 голосов
/ 06 августа 2020

На самом деле у меня есть два вопроса, которые могут быть связаны:

Вопрос 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];
    }

Ответы [ 3 ]

0 голосов
/ 18 августа 2020

Не могли бы вы попробовать эти вызовы графиков:

https://graph.microsoft.com/beta/users? $ filter = otherMails / any (id: id eq 'user@example.com') https://graph.microsoft.com/beta/users? $ filter = identity / any ( id: id / эмитент eq 'xxxx.onmicrosoft.com' и id / IssignedId eq 'user@example.com')

через Graph Explorer после входа в систему с помощью глобального администратора или Учетная запись администратора пользователя, нажав кнопку «Войти в обозреватель графиков» на левой панели. Также убедитесь, что учетная запись пользователя, которую вы используете, является учетной записью участника в вашем клиенте B2 C (созданном через Azure Портал> Azure Active Directory> Пользователи> Новый пользователь> параметр Создать пользователя) и не является гостевой или зарегистрированный пользователь.

Пожалуйста, дайте мне знать, работает ли это и выполняете ли вы эти вызовы в контексте того же пользователя из вашего кода.

0 голосов
/ 26 августа 2020

Для поиска пользователей, когда адрес электронной почты указан как альтернативный адрес электронной почты (атрибут otherMails):

  • graph.microsoft.com / beta / users? $ Filter = otherMails / any (id: id eq 'user@example.com')

Для поиска пользователей, когда адрес электронной почты указан как имя для входа (атрибут signInNames):

  • graph.microsoft.com / beta / users? $ Filter = identifities / any (id: id / эмитент eq 'xxxx.onmicrosoft.com' и id / IssignedId eq 'user@example.com')

Пожалуйста, примите ответ и здесь .

0 голосов
/ 06 августа 2020

Вы можете использовать этот API для получения информации

GET https://graph.microsoft.com/v1.0/users/ {id | userPrincipalName}? $ select = displayName, givenName, postalCode

...