Как я могу узнать, есть ли у моего приложения разрешение администратора? - PullRequest
0 голосов
/ 15 мая 2018

Я пишу веб-приложение, используя API безопасности в Microsoft Graph, и выполняю аутентификацию в Azure AD, но для доступа к API требуется согласие администратора для каждого арендатора, использующего мое приложение.

Как я могу проверить, дал ли администратор арендатора мое приложение?Таким образом, я знаю, отправлять ли пользователя в обычный поток входа в систему или в поток согласия администратора.

Можно ли сделать вызов REST в Azure AD для получения этой информации?Я пытался использовать oAuth2PermissionGrant, но это, похоже, работает только с идентификатором объекта, и у меня есть только мой идентификатор приложения / клиента.

Редактировать :

Я был озадачен тем, какие области были нужны в моем приложении, но получается, что когда я добавляю администратору только делегированные разрешения, такие как SecurityEvents.Read.All иSecurityEvents.ReadWrite.All только на Portal Registraion Application Portal и используйте только разрешение User.Read в моем приложении для запроса основной информации пользователей.При запросе токена доступа возможны два разных результата:

  • Если администратор не дал согласия моего приложения, токен доступа будет содержать только область действия User.Read.
  • Если администратор дал согласие, токен доступа будет содержать делегированные области действия User.Read, SecurityEvents.Read.All и SecurityEvents.ReadWrite.All.Хотя мое приложение запрашивает только User.Read.

, я обнаружил, что могу использовать это, чтобы определить, дало ли администратор согласие на мое приложение, проверив области действия маркеров доступа.Если он содержит SecurityEvents.Read.All или SecurityEvents.ReadWrite.All, пользователь может продолжить работу в приложении.Но если эти делегированные разрешения не входят в сферу действия, я могу попросить поток разрешений администратора https://login.microsoftonline.com/common/adminconsent?client_id=<APP ID>&state=12345&redirect_uri=http://localhost/myapp/permissions запросить разрешения для добавления к арендатору.

Спасибо @ marc-lafleur, я использовал администраторачтобы играть с oAuth2PermissionGrant в Graph Explorer, и я не поймал сценарий курица против яйца, пока вы не указали на это.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Замена значений этой ссылки значениями вашего приложения приведет вас на страницу авторизации.

https://login.microsoftonline.com/common/adminconsent?client_id=6731de76-14a6-49ae-97bc-6eba6914391e&state=12345&redirect_uri=http://localhost/myapp/permissions

Вы также можете использовать

https://login.microsoftonline.com/<Tenant_Id>/oauth2/authorize?client_id=<App Id>&response_type=code&redirect_uri=x-msauth-com-microsoft-testApp://com.microsoft.testApp&prompt=admin_consent

Это будет ;; откроет вам страницу, на которой можно авторизовать приложение, или сообщит вам о состоянии, если у вас нет прав администратора.

0 голосов
/ 15 мая 2018

Когда вы выполняете Согласие администратора, он добавляет следующие параметры запроса к вашему redirect_uri:

tenant={id}&admin_consent={bool}
  • tenant - это глобально уникальный идентификатор для арендатора, который только что выполнил администратораСогласие.
  • admin_consent - это логическое значение, которое указывает, было ли получено согласие администратора (true) или отклонено (false).

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

Также неплохо хранить дату и время.Это позволит вам повторно запросить согласие, если ваши зарегистрированные области изменились с момента их первоначального согласия.

Что касается конечной точки Графа, это не очень вам поможет.Так как вам нужен действительный токен для вызова в Graph, и вам нужно согласие администратора, прежде чем вы сможете получить этот токен, блокировка его внутри самого Graph будет представлять собой сценарий Chicken vs. Egg;вы не сможете проверить, согласились ли они до они согласились.

При этом вы можете определить согласие, используя ресурсы servicePrincipal и oAuth2PermissionGrant:

  1. Сначала вам нужно найти id для вашего приложения servicePrinipal используя ваш appId.

    /beta/servicePrincipals?$filter=appId eq '{appId}'
    
  2. Из ответа на предыдущий запрос возьмите id и используйте его для полученияoAuth2PermissionGrants для вашего приложения.

    /beta/oauth2PermissionGrants?$filter=resourceId eq '{servicePrincipal.id}'
    

Обратите внимание, что это /beta конечные точки и не подходят для производственного использования.

...