Управление приложением Microsoft Entra с помощью Microsoft Graph

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

Многие параметры приложений записываются как объекты, к которым можно получить доступ, обновить или удалить с помощью Microsoft Graph. Из этой статьи вы узнаете, как использовать Microsoft Graph для управления подробными сведениями об объектах приложения и субъекта-службы, включая свойства, разрешения и назначения ролей.

Предварительные условия

Для тестирования операций API требуются следующие ресурсы и привилегии:

  • Рабочий клиент Microsoft Entra.
  • Войдите в Graph Explorer как пользователь с правами, разрешенными для создания приложений в клиенте и управления ими.
  • Предоставьте себе наименьшее делегированное разрешение, указанное для операции.

Регистрация приложения с помощью Идентификатора Microsoft Entra

Следующий запрос создает приложение, указывая только обязательное свойство displayName . Другим свойствам присваиваются значения по умолчанию.

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

POST https://graph.microsoft.com/v1.0/applications
Content-type: application/json

{
  "displayName": "My application"
}

Запрос возвращает 201 Created ответ с объектом приложения в тексте отклика. Приложению назначается идентификатор , уникальный для приложений в клиенте, и идентификатор appId , который является глобально уникальным в экосистеме Идентификаторов Microsoft Entra.

Создание субъекта-службы для приложения

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

POST https://graph.microsoft.com/v1.0/servicePrincipals
Content-type: application/json

{
  "appId": "fc876dd1-6bcb-4304-b9b6-18ddf1526b62"
}

Запрос возвращает 201 Created ответ с объектом субъекта-службы в тексте ответа.

Обращение к приложению или объекту субъекта-службы

Вы можете обратиться к приложению или субъекту-службе по его идентификатору или идентификатору appId, где идентификатор называется идентификатором объекта , а appIdидентификатором приложения (клиента) в Центре администрирования Microsoft Entra. Эти синтаксисы поддерживаются для всех операций CRUD HTTP для приложений и субъектов-служб.

Обращение к приложению или субъекту-службе по его идентификатору.

https://graph.microsoft.com/v1.0/applications/{applicationObjectId}
https://graph.microsoft.com/v1.0/servicePrincipals/{servicePrincipalObjectId}

Обращение к приложению или субъекту-службе с помощью идентификатора appId.

https://graph.microsoft.com/v1.0/applications(appId='appId')
https://graph.microsoft.com/v1.0/servicePrincipals(appId='appId')

Кроме того, можно обратиться к объекту приложения, уникальному его uniqueName. С помощью этого свойства можно создать приложение с уникальным именем, если оно не существует, или обновить его, если оно существует. операция, называемая "Upsert".

Если приложение не существует, создайте приложение с указанным uniqueName, в противном случае обновите его.

PATCH https://graph.microsoft.com/v1.0/applications(uniqueName='{uniqueName}')
Content-Type: application/json
Prefer: create-if-missing

{
  "displayName": "Display name"
}

Настройка других базовых свойств для приложения

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

Вы настраиваете следующие основные свойства для приложения.

  • Добавьте теги для классификации в организации. Кроме того, используйте HideApp тег для скрытия приложения из "Мои приложения" и средства запуска Microsoft 365.
  • Добавьте основную информацию, включая логотип, условия предоставления услуг и заявление о конфиденциальности.
  • Хранение контактных данных о приложении
PATCH https://graph.microsoft.com/v1.0/applications/0d0021e2-eaab-4b9f-a5ad-38c55337d63e/
Content-type: application/json

{
    "tags": [
        "HR",
        "Payroll",
        "HideApp"
    ],
    "info": {
        "logoUrl": "https://cdn.pixabay.com/photo/2016/03/21/23/25/link-1271843_1280.png",
        "marketingUrl": "https://www.contoso.com/app/marketing",
        "privacyStatementUrl": "https://www.contoso.com/app/privacy",
        "supportUrl": "https://www.contoso.com/app/support",
        "termsOfServiceUrl": "https://www.contoso.com/app/termsofservice"
    },
    "web": {
        "homePageUrl": "https://www.contoso.com/",
        "logoutUrl": "https://www.contoso.com/frontchannel_logout",
        "redirectUris": [
            "https://localhost"
        ]
    },
    "serviceManagementReference": "Owners aliases: Finance @ contosofinance@contoso.com; The Phone Company HR consulting @ hronsite@thephone-company.com;"
}

Ограничение входа в приложение только назначенными удостоверениями

Следующая операция ограничивает удостоверения, которые могут входить в приложение, только теми, которым назначены все роли в приложении.

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

PATCH https://graph.microsoft.com/v1.0/servicePrincipals/89473e09-0737-41a1-a0c3-1418d6908bcd

{
    "appRoleAssignmentRequired": true
}

Назначение разрешений приложению

Хотя вы можете назначить разрешения приложению с помощью Центра администрирования Microsoft Entra, вы также можете назначить разрешения с помощью Microsoft Graph, обновив свойство requiredResourceAccess объекта приложения. Необходимо передать как существующие, так и новые разрешения. Передача только новых разрешений перезаписывает и удаляет существующие разрешения, на которые еще не было предоставлено согласие.

Назначение разрешений не предоставляет их приложению автоматически. По-прежнему необходимо предоставить согласие администратора с помощью Центра администрирования Microsoft Entra. Сведения о предоставлении разрешений без интерактивного согласия см. в статье Предоставление или отзыв разрешений API программным способом.

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

PATCH https://graph.microsoft.com/v1.0/applications/581088ba-83c5-4975-b8af-11d2d7a76e98
Content-Type: application/json

{
    "requiredResourceAccess": [
        {
            "resourceAppId": "00000002-0000-0000-c000-000000000000",
            "resourceAccess": [
                {
                    "id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6",
                    "type": "Scope"
                },
                {
                    "id": "3afa6a7d-9b1a-42eb-948e-1650a849e176",
                    "type": "Role"
                }
            ]
        }
    ]
}

Создание ролей приложения

Создание ролей приложения в объекте приложения

Чтобы сохранить все существующие роли приложения, включите их в запрос. В противном случае они заменяются новым объектом .

PATCH https://graph.microsoft.com/v1.0/applications/bbd46130-e957-4c38-a116-d4d02afd1057
Content-Type: application/json

{
    "appRoles": [
        {
            "allowedMemberTypes": [
                "User",
                "Application"
            ],
            "description": "Survey.Read",
            "displayName": "Survey.Read",
            "id": "7a9ddfc4-cc8a-48ea-8275-8ecbffffd5a0",
            "isEnabled": false,
            "origin": "Application",
            "value": "Survey.Read"
        }
    ]
}

Управление владельцами

Определение бесхозяйных субъектов-служб и субъектов-служб с одним владельцем

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

Для этого запроса требуется заголовок ConsistencyLevel с присвоенным значением eventual, так как в запросе присутствует $count. Дополнительные сведения об использовании ConsistencyLevel и $countсм. в разделе Дополнительные возможности запросов к объектам каталога.

Этот запрос также возвращает количество приложений, соответствующих условию фильтра.

GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=owners/$count eq 0 or owners/$count eq 1&$count=true
ConsistencyLevel: eventual

Назначение владельца приложению

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

В следующем запросе 8afc02cb-4d62-4dba-b536-9f6d73e9be26 — это идентификатор объекта для пользователя или субъекта-службы.

POST https://graph.microsoft.com/v1.0/applications/7b45cf6d-9083-4eb2-92c4-a7e090f1fc40/owners/$ref
Content-Type: application/json

{
    "@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/8afc02cb-4d62-4dba-b536-9f6d73e9be26"
}

Назначение владельца субъекту-службе

Делегированное разрешение с наименьшими привилегиями: Application.ReadWrite.All.

Следующий запрос ссылается на субъект-службу, используя его appId. Вы также можете ссылаться на него с помощью идентификатора объекта в шаблоне ../servicePrincipals/{bject ID}/owners/$ref. 8afc02cb-4d62-4dba-b536-9f6d73e9be26 — это идентификатор объекта для пользователя или субъекта-службы.

POST https://graph.microsoft.com/v1.0/servicePrincipals(appId='46e6adf4-a9cf-4b60-9390-0ba6fb00bf6b')/owners/$ref
Content-Type: application/json

{
    "@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/8afc02cb-4d62-4dba-b536-9f6d73e9be26"
}

Блокировка конфиденциальных свойств для субъектов-служб

Функция блокировки экземпляров приложений позволяет защитить конфиденциальные свойства мультитенантных приложений от несанкционированного изменения. Следующие свойства объекта субъекта-службы можно заблокировать:

  • keyCredentials, где тип использования имеет значение Sign или Verify.
  • passwordCredentials, где тип использования имеет значение Sign или Verify.
  • свойство tokenEncryptionKeyId .

Вы управляете функцией блокировки экземпляра приложения с помощью свойства servicePrincipalLockConfiguration объекта приложения мультитенантного приложения.

Блокировка всех конфиденциальных свойств субъекта-службы

Если значение isEnabled и allProperties имеет значение true, даже если другие свойства объекта servicePrincipalLockConfiguration имеют nullзначение , все конфиденциальные свойства субъекта-службы блокируются.

PATCH https://graph.microsoft.com/beta/applications/a0b7f39e-3139-48aa-9397-f46fb63102f7

{
    "servicePrincipalLockConfiguration": {
        "isEnabled": true,
        "allProperties": true
    }
}

Блокировка определенных конфиденциальных свойств субъекта-службы

В следующем примере свойства keyCredentials и passwordCredentials субъекта-службы блокируются и включается функция блокировки экземпляра приложения.

PATCH https://graph.microsoft.com/beta/applications/a0b7f39e-3139-48aa-9397-f46fb63102f7

{
    "servicePrincipalLockConfiguration": {
        "isEnabled": true,
        "credentialsWithUsageSign": true,
        "credentialsWithUsageVerify": true
    }
}

Настройка доверенных центров сертификации для приложений

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

Шаг 1. Создание цепочки доверия сертификатов

Делегированные разрешения с наименьшими привилегиями: AppCertTrustConfiguration.Read.All роль Microsoft Entra с наименьшими привилегиями: Application Administrator

POST https://graph.microsoft.com/beta/certificateAuthorities/certificateBasedApplicationConfigurations

{
    "displayName": "Trusted Certificate Chain of Trust for Contoso",
    "description": "The Trusted Certificate Chain of Trust containing a certificate chain used by app policy, to only allow application certificates from selected issuer.",
    "trustedCertificateAuthorities": [
        {
            "isRootAuthority": true,
            "certificate": "MIIFVjCCAz6gAwIBAgIQJdrL...UyNDIyNTcwM1owPDE …="
        },
        {
            "isRootAuthority": false,
            "certificate": QAAAAAAWjABAQsFADA8M...UyNDIyNTcwM1o …="
        }
    ]
}

Запрос возвращает объект отклика 200 OK. Ответ включает идентификатор цепочки сертификатов объекта доверия. Предположим, что идентификатор имеет значение eec5ba11-2fc0-4113-83a2-ed986ed13743.

Шаг 2. Назначение цепочки сертификатов доверия политике управления приложениями

В следующем примере настраивается политика, гарантирующая, что в приложения в клиенте можно добавлять только сертификаты, выданные промежуточным центром сертификации, определенным на предыдущем шаге. ОбъектkeyCredentialsapplicationRestrictions> определяет свойство restrictionType со значением trustedCertificateAuthority, которое ссылается на созданный идентификатор. Так как эта политика применяется к политике управления приложениями на уровне клиента по умолчанию, она применяется ко всем приложениям, созданным в клиенте, и отклоняет попытки добавления несоответствующих сертификатов в составе учетных данных сертификата приложения.

Эта политика гарантирует, что в приложения можно добавлять только сертификаты из указанного промежуточного центра сертификации. Объект applicationRestrictions>keyCredentials задает для параметра restrictionTypetrustedCertificateAuthorityзначение , ссылающееся на созданный идентификатор. Эта политика применяется ко всем приложениям в клиенте, отклоняя все несоответствующие сертификаты.

Делегированные разрешения с наименьшими привилегиями: Policy.Read.ApplicationConfiguration роль Microsoft Entra с наименьшими привилегиями: Security Administrator

PATCH https://graph.microsoft.com/v1.0/policies/defaultAppManagementPolicy

{
  "id": "d015220e-9789-4e8e-bbcc-270fe419229d",
  "description": "Lorem ipsum",
  "displayName": "Credential management policy",
  "isEnabled": true,
  "applicationRestrictions": {
    "passwordCredentials": [
      {
        "restrictionType": "passwordLifetime",
        "maxLifetime": "P14D",
        "restrictForAppsCreatedAfterDateTime": "2020-01-01T07:00:00Z"
      }
    ],
    "keyCredentials": [
      {
        "restrictionType": "certificateLifetime",
        "restrictForAppsCreatedAfterDateTime": "2020-01-01T10:37:00Z",
        "maxLifetime": "P90D"
      },
      {
        "restrictionType": "trustedCertificateAuthority",
        "certificateBasedApplicationConfigurationIds": [
          "eec5ba11-2fc0-4113-83a2-ed986ed13743"
        ],
        "restrictForAppsCreatedAfterDateTime": "2019-10-19T10:37:00Z"
      }
    ]
  }
}