С годами API Microsoft Graph постоянно улучшались.
В 2021 году была реализована одна очень востребованная функция «Только приложение» или гранулярный доступ к отдельному сайту вместо всего арендатора, эта область называется «Сайты.Выбрано».
Изначально для этой области существует два уровня разрешений, которые можно назначать приложениям: «чтение» и «запись».
Некоторые клиенты обнаружили, что задачи управления невозможно выполнить даже с уровнем разрешений «на запись». Чтобы решить эту проблему, в этом году были добавлены уровни разрешений «полный контроль» и «управление».
Вот шаги для реализации разрешений App Only Sites.Selected:
Шаг I. Зарегистрируйте приложение AAD на портале Azure. https://portal.azure.comи назовем это приложение «Целевое приложение».
Подробнее см. в этих статьях:
Краткое руководство: регистрация приложения на платформе Microsoft Identity — Microsoft Entra | Майкрософт учиться
Учебник. Регистрация приложения в Azure Active Directory (Microsoft Dataverse) — Power Apps | Майкрософт…
После регистрации целевого приложения скопируйте приведенную ниже информацию в текстовый файл:
Отображаемое имя: Приложение Contoso Time Manager
Идентификатор клиента: d806f38b-a107****-1ec8e90c8ccc
Секрет клиента: XZW8Q*****855JDEw1cxP
Идентификатор каталога (арендатора): 31********95c59c1b
Шаг II. Предоставьте целевому приложению разрешение для API Graph и/или API SharePoint на портале Azure в зависимости от того, будете ли вы получать доступ к ресурсу сайта с помощью
Графический API, например, https://graph.microsoft.com/v1.0/…
или SharePoint Rest API, например, /_апи/…
Если вам нужно использовать Graph API для доступа к SharePoint, вы предоставляете разрешения Graph API.
Если вам нужно использовать API SharePoint, например SPO Rest API, SPO CSOM, вы предоставляете разрешения SharePoint API.
Шаг III. Используйте конечную точку Graph API, указанную в этой статье. https://learn.microsoft.com/en-us/graph/api/site-post-permissions?view=graph-rest-1.0&tabs=http чтобы назначить целевому приложению разрешение на определенный сайт SharePoint Online.
POST
Content-Type: application/json{
"roles": ["write"],
"grantedToIdentities": [{
"application": {
"id": "89ea5c94-7736-4e25-95ad-3fa95f62b66e", //Target Application’s Client Id
"displayName": "Contoso Time Manager App" //Target Application’s Display name
}
}]
}
Импорт заключается в том, что для этого вам нужно иметь другое приложение, которое имеет разрешение Sites.FullControl.All для Graph API, затем вы получаете App Only AccessToken с идентификатором этого приложения, и вы можете сделать вышеуказанный вызов с заголовком авторизации, значением является «Носителем {tokenvalue}».
Ниже приведена Fiddler Trace вызова API Graph для назначения разрешения целевому приложению:
POST HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV8CJY2R……………qtlW1WoBXu3fdR8G7R-
Accept: application/json
User-Agent: NONISV|SharePointPnP|PnPCore/1.11.2.0 (Microsoft Windows NT 10.0.22621.0)
Content-Type: application/json
Host: graph.microsoft.com
Content-Length: 132
{"roles":["write"],"grantedToIdentities":[{"application":{"id":"ea5f05ef-2a5c-418b-b679-0380b3e83fd3","displayName":"aadAppOnly"}}]}
Теперь вашему целевому приложению успешно предоставлено разрешение на доступ к конкретному сайту!
Если вы выбрали разрешение Graph API Sites.Selected Application, вы можете использовать Graph API для доступа к сайту.
Если вы выбрали разрешение SharePoint Sites.Selected Application, вы можете использовать SharePoint Rest API или CSOM для доступа к сайту.
ПРИМЕЧАНИЕ. Для API-интерфейсов SharePoint вы не можете использовать только секрет клиента для аутентификации, вам необходимо настроить сертификат, чтобы получить токен доступа.
A. Тестовый запуск API графа:
Проверить доступ к конкретному сайтувы можете использовать следующий пример сценария PowerShell, чтобы получить токен доступа только к приложению и получить сайт с помощью Graph API, см. ссылку
#AAD AppOnly for Graph API
$tenantId="{tenantId}"
$aadClientId = "{clientId}"
$aadClientSecret = "{clientSecret}"
$scopes = "
$loginURL = "
$body = @{grant_type="client_credentials";client_id=$aadClientId;client_secret=$aadClientSecret;scope=$scopes}
$Token = Invoke-RestMethod -Method Post -Uri $loginURL -Body $body
$Token.access_token #expires after one hour
$headerParams = @{'Authorization'="$($Token.token_type) $($Token.access_token)"}
$headerParams
#Graph API call to get site
Invoke-WebRequest -Method Get -Headers $headerParams -Uri "
Ответ:
Если вы попытаетесь получить доступ к другому сайту, которому не было предоставлено разрешение, вы получите сообщение об ошибке (403) Forbidden.:
B. Доступ к API SharePoint:
Чтобы сделать вызовы SPO REST и CSOM только для приложения, вам потребуется создать сертификаты и загрузить открытый ключ (файл .cer) в Azure — регистрация приложения — приложение — сертификаты и секреты:
Самый простой тестовый скрипт с использованием PnP-команд: Справочник: Подключить-PnPOnline | ПнП PowerShell
$aadClientId = "*"
$SiteURL =
$secure = ConvertTo-SecureString "***" -AsPlainText –Force
Connect-PnPOnline -Url $SiteURL -CertificatePath c:..test.pfx -Tenant contoso.onmicrosoft.com -ClientId $aadClientId -CertificatePassword $Secure
Get-PnPSite
На других языках программирования вы можете использовать библиотеку MSAL для получения токена доступа только к приложению с сертификатом через поток учетных данных клиента, затем вы можете прикрепить этот токен к веб-запросам, см. ссылку: https://learn.microsoft.com/en-us/azure/active-directory/develop/sample-v2-code.