Microsoft Office 365 アクティビティを「アプリケーション ID とシークレット」認証で使用するとき特定のSharePointサイトにだけアクセス可能にする方法

Microsoft Office 365 アクティビティを「アプリケーション ID とシークレット」認証で使用するとき特定のSharePointサイトにだけアクセス可能にするには、Microsoft Entra ID (Azure Active Directory)のアプリケーションにSites.Selected権限を設定し、その後対象のSharePointサイトに当該のアプリケーションに対する権限を設定します。

以下に具体的な手順をご案内します。

設定手順

1. まず次のガイドに従って設定を行います。

「APIのアクセス許可」の箇所でサイトに関して次の権限を設定する記述がありますが、この部分を変更する必要があります。

  • Sites.Read.All
  • Sites.ReadWrite.All

上記の設定ではすべてのサイトへのアクセスが許可されるため、代わりに次の権限を指定します。

  • Sites.Selected

その後、必要に応じて作成したアプリケーションにサイトへのアクセス権限を追加します。

以下ではMicrosoft社が提供するGraph Explorerでの手順を記載します。

2. 次のURLを開き、サインインを行います。

3. サインイン後、「Consent to permissions」をクリックし、Sitesに関連する権限(Sites.Read.All, Sites.ReadWrite.All, Sites.FullControll.All, Sites.Manage.All)をGraph Explorerに付与します。

4. 対象のサイトのIDを調べます。

次のようなリクエストをGraph Explorerで行い、"value"配列から対象のサイトに一致するアイテムを見つけ、その中の"id"の値がサイトのIDになります。

GET https://graph.microsoft.com/v1.0/sites?search=<SharePointサイト名>

次の例では [xxxxxx.sharepoint.com](http://xxxxxx.sharepoint.com/),ea97e1cd-4719-4907-b26e-cd5c246bd2aa,e8b23463-6af0-43e5-b6c1-ea141f11ecc9 がサイトのIDです。

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites",
    "@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET sites?$select=displayName,error",
    "value": [
        {
            "createdDateTime": "2020-04-21T03:22:55Z",
            "id": "xxxxxx.sharepoint.com,ea97e1cd-4719-4907-b26e-cd5c246bd2aa,e8b23463-6af0-43e5-b6c1-ea141f11ecc9",
            "lastModifiedDateTime": "2020-04-18T23:28:49Z",
            "name": "xxxxxx",
            "webUrl": "https://xxxxxx.sharepoint.com/sites/xxxxxx",
            "displayName": "xxxxxx",
            "root": {},
            "siteCollection": {
                "hostname": "xxxxx.sharepoint.com"
            }
        },
~略~

5. サイトへのアクセス権をアプリケーションに付与します。

次のようなリクエストをGraph Explorerで行います。ここでは作成したアプリケーションにあるサイトへのwrite権限を与えています。

POST https://graph.microsoft.com/v1.0/sites/<対象のサイトのID>/permissions
 
{
  "roles": ["write"],
  "grantedToIdentities": [{
    "application": {
      "id": "<作成したアプリケーションのID>",
      "displayName": "<作成したアプリケーションの名前>"
    }
  }]
}

HTTP レスポンスステータスコード201が返れば成功です。

6. O365アクティビティからのアクセスが想定通りになるかを確認します。

権限が不足しアクセスに失敗する場合、次のようなエラーが発生します。

RemoteException wrapping Microsoft.Graph.ServiceException: Code: accessDenied
Message: Access denied

結果が想定通りでない場合、問題が生じているGraph APIを特定するためにFiddlerを使用し、HTTPリクエストの詳細を確認します。

参考: