Azure Graph API, Angular, получение групп пользователей

Я хочу запросить Azure AD Graph API, чтобы получить утверждение группы для вошедшего в систему пользователя из зарегистрированного приложения Azure B2C. Приложение, из которого я звоню, - это Angular 5 SPA.

После экспериментов с Azure Active Directory и adal-angular4 мне удалось получить пользовательское утверждение ролей. Для этого я зарегистрировал приложение Azure AD, установил требуемые области разрешений, добавил настраиваемые роли в манифест приложения, добавил пользователя в приложение и установил настраиваемую роль для пользователя. Затем я использовал идентификатор приложения и клиента моего нового зарегистрированного приложения для конфигурации adal-angular4. Когда я запрашиваю конечную точку, я получаю токен, содержащий утверждение ролей. Это работает хорошо. Когда я меняю роль, это отображается в токене.

Этого утверждения ролей мне было бы достаточно, но для этого требуется два входа: один для моего приложения B2C и один для другого зарегистрированного приложения. Я не думаю, что могу использовать один и тот же токен для обоих.

Чтобы иметь только один логин, я хочу напрямую запросить Azure B2C. Я слышал, что он не предлагает возможности запрашивать роли пользователя, такие как Azure Active Directory, и был направлен на использование групп пользователей. Я также видел документацию, и мне сказали, что мне нужно использовать API Azure Graph, потому что Microsoft Graph еще не реализовал возможность запрашивать эту информацию.

Я попытался пойти по тому же пути для B2C, который использовал с AAD. Я создал группу и добавил в нее пользователя. Я попытался получить доступ к информации моего приложения B2C с помощью конечной точки API Azure Graph https://graph.windows.net/myorganization/users?api-version=1.6 с использованием MSAL.js, но я получаю сообщение об ошибке «код»: «Authentication_MissingOrMalformed». Я проверил, что токен получен MSAL и добавлен в запрос. Когда я меняю URL-адрес на недействительный, я получаю ту же ошибку. Я искал и нашел вопросы с той же проблемой здесь, здесь, но никто не ответил

Как исправить эту ошибку?

Обязательно ли иметь учетную запись локального администратора?

Есть ли какие-то особые области, которые мне нужно установить в моем приложении B2C, чтобы предоставлять авторизацию для моих запросов? Если да, то какие именно? Я попытался поменять местами разные значения для областей в конфигурацию MSAL и не нашел ничего, что работает.

Это приложение должно быть мультитенантным?

Я нашел ресурсы по доступу токены и scopes, но я использую Angular 5 / typescript и не имею клиентской библиотеки Azure AD Graph, доступной в .NET. Я не смог использовать ни один из ресурсов.


person afriedman111    schedule 11.01.2018    source источник
comment
Было бы неплохо, если бы они пришли назад как претензии   -  person spottedmahn    schedule 13.01.2018


Ответы (2)


Я хотел написать это, чтобы помочь другим, которые могли застрять в той же колее, в которой пытался найти основное направление / понимание. По сути, я придерживался рабочего процесса, описанного @Chris Pradget. Однако мое первоначальное восприятие проблемы было неправильным, и я поясню, в чем заключалась моя ошибка, и дам небольшой контекст.

Моя первоначальная цель состояла в том, чтобы подавать заявки на роли и / или группы пользователей, когда пользователь входит в мое приложение Azure / Angular. В Azure нет простого способа сделать это, когда вы входите в систему с помощью Azure B2C для получения политик. (В некотором смысле кажется, что Firebase упрощает эту задачу).

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

(Просто напомню, что я называю свое классическое зарегистрированное приложение в Azure AD "регистрацией приложения", чтобы провести различие от реализации кода и конфигурации, установленной на портале Azure)

Потребовалось много экспериментов, но я придумал кое-что, что, кажется, работает. По сути, я получаю 3 токена: 2 в Angular с использованием MSAL.js и один в .NET с использованием ADAL для Microsoft Graph. Один в Angular предназначен для первоначального входа в систему (вызов loginRedirect клиента MSAL) для получения id_token, а другой, который я получил, используя этот токен вместе с функцией aquireTokenSlient, для получения access_token. Я отправил это на свой сервер .NET Core, где использовал идентификатор пользователя из входящего токена в качестве идентификатора ресурса в запросить Microsoft Graph, чтобы получить заявку на мои группы, а затем я создал мой собственный токен JWT с заявками, которые нужно отправить обратно в Angular для моих охранников маршрута.

В моем исследовании следует отметить следующие моменты:

Azure AD Graph против Microsoft Graph для получения групп пользователей: существует противоречивая информация о том, что использовать, некоторые говорят, что Microsoft Graph, потому что Azure Graph устарел, но другие говорят, что Azure Graph, потому что MS Graph еще не охватывает все основы. После экспериментов я обнаружил, что могу извлекать группы пользователей из MS Graph. Учитывая это и тот факт, что MS Graph новее, я выбрал MS Graph. Для экспериментов с графиками я использовал как Azure Graph Explorer, так и MS Graph Explorer.

Мне потребовалось некоторое время, чтобы успешно запросить Microsoft Graph, но когда я это сделал, я использовал MS Graph Explorer, как указано выше. Основная проблема, с которой я впервые столкнулся, заключалась в том, что я запрашивал свое приложение с помощью своей учетной записи. Только некоторые запросы работали, и даже те возвращали очень ограниченную информацию. Только когда я перечитал в этой статье об API-интерфейсе Azure AD Graph, заметил ли я, что для запроса Graphs вам нужно использовать идентификатор пользователя, который является локальным для домена вашего клиента и является администратором. Когда я создал и использовал администратора своего клиента (из этого домена), все запросы работали. Итак, что касается моих вопросов выше:

1) Как исправить эту ["code": "Authentication_MissingOrMalformed"] ошибку? Используйте учетную запись локального администратора

2) Обязательно ли иметь учетную запись локального администратора? Да

3) Есть ли какие-то особые области, которые мне нужно установить в моем приложении B2C, чтобы предоставлять авторизацию для моих запросов? Если да, то какие именно? Чтобы запросить MS Graph с помощью ADAL, используйте Directory.Read Access

4) Это приложение должно быть мультитенантным? Нет

Кроме того, в своем исследовании я обнаружил, что вместо использования групп B2C вы можете использовать роли Azure AD. В частности, роли приложения можно добавить в манифест классического приложения Azure AD на портале Azure. Это был другой маршрут, который казался мне многообещающим. Я нашел эту статью, в которой описывается, как чтобы отредактировать манифест, чтобы добавить роли приложения. Сначала вы добавляете роли в манифест, затем назначаете пользователям роли на портале Azure, а затем запрашиваете информацию о пользователе (из Angular) с помощью библиотеки ADAL.js. Когда вы входите в систему с помощью библиотеки, роли приложения снижаются на полученном токене. Это, конечно, не использует политики B2C. Это также может быть само собой разумеющимся, но при входе в систему ни B2C id_token, ни access_token не могут быть использованы для получения учетных данных / токена Classic Azure AD. Я пытался придумать другие способы добиться того, чего хотел. Учитывая, что две регистрации находятся в одном клиенте, я подумал, что могу использовать единый вход для входа в один и оставаться в системе для другого. Я не ушел очень далеко. Еще один метод, который я рассмотрел, заключался в использовании настраиваемых политик для извлечения данных из моего классического приложения Azure AD, но и в этом далеко не ушел.

Также, когда @Chris Padgett упомянул о создании «пользовательского API», я неправильно его истолковал. Под "пользовательским API" я думал, что он имел в виду мою классическую регистрацию приложения Azure Ad, которая была настроена на портале Azure, хранит мою пользовательскую информацию и действует как API для получения моего токена. Я думал, что сначала мне нужно получить токен доступа от B2C в Angular, а затем использовать этот токен (все еще в Angular) для доступа к моей классической регистрации в Azure AD. Оттуда я мог бы вытащить информацию о моих пользователях, включая роли приложений (которые доступны при редактировании манифеста). Это не сработало бы, потому что, как я сказал выше, я хотел сделать это с одним входом, а вы не можете использовать токен B2C в классическом приложении Azure AD. Даже если бы это сработало, потребовалось бы установить роли для пользователей в моей классической регистрации приложения Azure AD за пределами моего приложения B2C, чего я не хотел делать. Регистрация одного приложения для политик и другого для управления ролями пользователей не очень элегантна. Также для его работы потребуется 2 входа в систему: один для B2C и один для Classic Azure AD. При таком подходе кажется, что эти 2 приложения - отдельные, и я не хочу разделять проблемы между двумя платформами. Итак, в конце концов, сценарий входа в систему с помощью B2C в Angular с последующим обращением к серверу для извлечения групп пользователей с помощью MS Graph является лучшим. Бэкэнд-приложение должно войти в систему только один раз, независимо от пользователей, обращающихся к нему, что означает, что пользователям не нужно входить дважды. Также он объединяет мою информацию с моей регистрацией в приложении B2C.

Я думаю, что в будущем Azure может в конечном итоге предоставить группы и / или роли в их id_tokens, но я подумал, что эта информация может быть полезна людям в то же время. Кроме того, вот ссылки на другие вопросы, которые я задал, которые помогли мне в моем исследовании:

Узнал, что мне нужно использовать MSAL.js вместо ADAL.js, чтобы использовать B2C Политики.

Я задал аналогичный вопрос о запросе MS Graph и получении ограниченного ответа

person afriedman111    schedule 22.02.2018
comment
Спасибо за подробности здесь. Найти хорошее объяснение очень сложно. У меня возник вопрос, как вы справились с обновлением / обновлением idtoken? Я использую msal, чтобы получить Idtoken, и срок действия idtoken истекает через 60 минут, что заставляет пользователя снова войти в систему. Кроме того, как мы можем установить время истечения срока действия idtoken? Любая помощь будет оценена!! - person CKS; 15.08.2018
comment
Извините, я еще не успел обновить токен идентификатора. - person afriedman111; 22.08.2018

Azure AD B2C выдает токены с помощью конечной точки Azure AD v2.0:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

Для API Graph Azure AD требуются токены, которые выдаются с помощью конечной точки Azure AD v1.0:

https://login.microsoftonline.com/{tenant}/oauth2/token

Чтобы одностраничное приложение могло получить доступ к Azure AD Graph API, вы должны связать их с помощью прокси-API (я назову его User API) следующим образом.

Во время разработки:

  1. Зарегистрируйте одностраничное приложение с помощью портала Azure AD B2C.
  2. Зарегистрируйте пользовательский API с помощью портала Azure AD и предоставить разрешение Чтение данных каталога < / а>.

Во время выполнения:

  1. Одностраничное приложение перенаправляет конечного пользователя в конечную точку Azure AD B2C v2.0 для входа. Azure AD B2C выдает маркер идентификатора, содержащий идентификатор пользователя.
  2. Одностраничное приложение вызывает пользовательский API с этим токеном идентификатора. Пользовательский API проверяет токен идентификатора.
  3. Пользовательский API получает токен доступа от конечной точки Azure AD v1.0, используя учетные данные приложения, которые были созданы во время разработки на шаге 2.
  4. Пользовательский API вызывает API-интерфейс Azure AD Graph, передавая идентификатор пользователя, полученный на шаге 2, с токеном доступа, выданным на шаге 3, запрашивает членство в группах и затем возвращает их одностраничному приложению.
person Chris Padgett    schedule 11.01.2018
comment
Я использую MSAL.js и запрашиваю следующую конечную точку для моей политики входа: 'login.microsoftonline .com / tfp / $ {tenant} / $ {signUpSignInPolicy} '. После входа пользователь возвращается в приложение с токеном. Следует ли мне использовать этот токен для входа в пользовательский API? Мне удалось получить данные с отдельным входом из пользовательского API с помощью adal-angular4, который, как мне кажется, использует указанную выше конечную точку Azure AD v1.0 (проверено с помощью Fiddler). Я могу попытаться избежать этого второго входа в систему, заменив токен. Я использовал Postman для создания этих запросов вручную, но у меня возникли проблемы. - person afriedman111; 14.01.2018
comment
Привет @ afriedman111. Приложение Angular должно получить токен политики, а затем отправить его в пользовательский API. Пользовательский API должен это проверить. Если он действителен, то пользовательский API должен получить токен v1.0, используя свои учетные данные приложения, и передать его в Graph API для получения групп пользователей. - person Chris Padgett; 15.01.2018
comment
Я попытался использовать свой токен политики для входа в конечную точку v1.0. Я получил его из B2C с помощью MSALjs (v2.0) и подключил его к ADAL.js (v1.0), чтобы войти в свой пользовательский API. Вход в систему дает мне авторизацию и ошибки CORS. Стоит ли менять токен политики? Может поменять публику? Или, может быть, использовать единый вход? Мой пользовательский API работает, когда я вхожу в систему независимо. - person afriedman111; 18.01.2018
comment
Я также мог бы создать настраиваемую политику B2C, которая будет получать заявки от моего User Api. - person afriedman111; 18.01.2018
comment
Маркер идентификатора, выданный Azure AD B2C на шаге 1, не может использоваться для взаимодействия с Azure AD Graph API на шаге 4. Пользовательский API должен проверять маркер идентификатора (представляющий идентификатор пользователя), который передается из единого -page, а затем получить другой токен доступа (представляющий его собственное удостоверение), который можно передать в API Graph Azure AD. Да, в противном случае вы можете создать настраиваемую политику, которая вызывает ваш пользовательский API (защищенный с помощью базовой HTTP-аутентификации или проверки подлинности сертификата клиента) для получения групповых утверждений через Azure AD Graph API. - person Chris Padgett; 18.01.2018
comment
Я полностью понял эту идею после целой недели попыток, чтения и попыток еще. Я НЕ МОГУ найти пример того, КАК этот второй токен приобретается. Я хоть и был, но в последнюю минуту врезался в CORS. - person goneos; 28.03.2019
comment
Привет, @goneos. Вы имеете в виду получение токена доступа на шаге 3? - person Chris Padgett; 28.03.2019
comment
Ага ... это тот. У меня он работает в Postman, но когда я пытаюсь сделать это в приложении Angular, он попадает в CORS. - person goneos; 28.03.2019
comment
Когда я жестко кодирую токен, который я получаю в Postman, я могу получить всю необходимую информацию из графика. - person goneos; 28.03.2019
comment
На шаге 3 рекомендуется, чтобы пользовательский API (то есть код на стороне сервера) взаимодействовал с Azure AD и Azure AD Graph API, поэтому у вас не должно возникнуть проблем с CORS. - person Chris Padgett; 28.03.2019
comment
Привет, @ChrisPadgett. Я пытаюсь получить членство в группе, а информация, которая у меня уже есть о пользователе, не имеет групп (у пользователя их слишком много), поэтому я запрашиваю, используя graph.microsoft.com/v1.0/users/group_id/memberOf. Это все работает, но для этого мне нужен токен. Я использую вызов POST для login.microsoftonline.com/app_id/oauth2/v2 .0 / token, чтобы получить токен, и именно здесь я нажимаю CORS. - person goneos; 28.03.2019
comment
Привет, @ChrisPadgett. Я разместил здесь свой вопрос - ссылка. Буду очень признателен за любой вклад, который вы можете внести. - person goneos; 29.03.2019