Я пытаюсь обновить коллекцию identities
для существующего пользователя в клиенте Azure AD B2 C. В частности, я пытаюсь добавить еще одну federated
идентификационную запись для пользователя.
В соответствии с документацией Microsoft Graph это должно быть возможно при условии, что я:
- Назначение
User.ManageIdentities.All
разрешения для клиента, который я использую для вызова графа - Отправка всей существующей коллекции идентификаторов с добавлением новой записи идентификатора (это также гарантирует, что существующий идентификатор с 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 сбивает меня с толку.
Что я делаю не так?