Как обновить коллекцию удостоверений для существующего пользователя B2 C, используя Microsoft Graph и SDK - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь обновить коллекцию identities для существующего пользователя в клиенте Azure AD B2 C. В частности, я пытаюсь добавить еще одну federated идентификационную запись для пользователя.

В соответствии с документацией Microsoft Graph это должно быть возможно при условии, что я:

  1. Назначение User.ManageIdentities.All разрешения для клиента, который я использую для вызова графа
  2. Отправка всей существующей коллекции идентификаторов с добавлением новой записи идентификатора (это также гарантирует, что существующий идентификатор с signInType userPrincipalName также отправляется в запросе)

Я зарегистрировал приложение в клиенте B2 C и назначил ему определенные c разрешения для доступа к Microsoft Graph. Я использую поток Client Credentials для получения токена доступа с соответствующими разрешениями в заявке roles. Я могу успешно получить токен доступа и подтвердил наличие необходимых разрешений, проверив выпущенный JWT.

Я также использую Microsoft.Graph SDK для выполнения вызовов графа Конечные точки v1.0 из C# кода. У меня есть существующий пользователь, которого я пытаюсь обновить, с хорошо известным userId (objectId). Используя токен доступа и GraphServiceClient, я могу успешно получить пользователя. Например, следующий код работает нормально

var user = await client.Users[userId].Request()
    .Select(o => new { o.Id, o.DisplayName, o.Identities })
    .GetAsync();

После извлечения пользователя я пытаюсь добавить еще одну запись в свойство identities для пользователя и выполнить для него вызов графика обновления. Обратите внимание, что для SDK требуются вызовы обновления, чтобы использовать только объекты, созданные локально, т. Е. Вы не можете отправить существующий объект, который был ранее извлечен через SDK.

Мой полный код обновления выглядит следующим образом:

async Task TryUpdateUser(GraphServiceClient client, string userId)
{
    var user = await client.Users[userId].Request()
        .Select(o => new { o.Id, o.DisplayName, o.Identities })
        .GetAsync();

    // Need to re-create the existing identities since Graph client rejects existing items in requests
    var identities = user.Identities.Select(o => new ObjectIdentity 
    {
        SignInType = o.SignInType,
        Issuer = o.Issuer,
        IssuerAssignedId = o.IssuerAssignedId
    }).ToList();

    identities.Add(new ObjectIdentity
    {
        SignInType = "federated",
        Issuer = "TestIssuer",
        IssuerAssignedId = "testingId"
    });

    var updatedUser = new User
    {
        Identities = identities
    };

    await client.Users[userId].Request().UpdateAsync(updatedUser);
}

Однако, когда вызывается UpdateAsync, генерируется исключение с типом ответа BadRequest. Сообщение об ошибке гласит:

Сообщение: добавление не-федеративного пользователя signInType запрещено, если у пользователя только социальные / федеративные идентификаторы или не установлены идентификаторы. Пожалуйста, заново создайте пользователя с не-федеративным удостоверением вместе с существующими удостоверениями, если таковые имеются.

Я явно пытаюсь создать объединенный пользователь signInType, поэтому текст сообщения об ошибке ссылается на не федеративный пользователь signInType сбивает меня с толку.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

В настоящее время мы не можем перенести Azure AD b2 c федеративного пользователя из одного поставщика удостоверений в другой поставщик удостоверений и добавить другого поставщика удостоверений или не федеративного удостоверения (userName или emailAddress) для Azure AD b2 c федеративный пользователь. Если вы попытаетесь это сделать, вы получите ошибку, как указано выше.

enter image description here

Кроме того, обратите внимание, что мы можем добавить одного провайдера идентификации для Azure AD b2 c локального пользователя. enter image description here

0 голосов
/ 09 апреля 2020

Как указывает принятый ответ, обновление существующего федеративного пользователя для добавления дополнительных федеративных идентификаторов в настоящее время не поддерживается Microsoft Graph API.

Однако это можно сделать с помощью Azure AD Graph. API вместо Информацию о доступных параметрах обновления пользователя см. В Azure обновлении API Graph AD .

Если у нас есть userId, которое мы хотим обновить, вам необходимо выполнить следующее:

  1. Извлечение существующего пользователя userIdentities с помощью запроса GET для https://graph.windows.net/{tenant}/users/{userId}/userIdentities?api-version=1.6
  2. Добавление еще одной записи UserIdentity к существующим удостоверениям - что важно, когда вы указываете issuerUserId значение ДОЛЖНО быть закодировано в base64
  3. Отправить запрос PATCH конечной точке базового пользователя на https://graph.windows.net/{tenant}/users/{userId}?api-version=1.6 - отправляемый вами контент - это просто JSON объект с единственным свойством userIdentities, которое массив, содержащий существующие и вновь добавленные идентификаторы

После выдачи запроса PATCH через API AAD Graph можно затем использовать Microsoft Graph API для запроса обновленного пользователя и подтверждения наличия дополнительной записи. добавлен в коллекцию identities с SignInType из federated.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...