SharePoint アプリ専用のアクセスを許可する

SharePoint アプリ専用は古いものですが、依然として非常に有用な、アプリのプリンシパルの設定モデルです。 このモデルは、SharePoint Online と SharePoint オンプレミス (2013/2016/2019/サブスクリプション エディション) の両方で機能し、オンプレミスの SharePoint から SharePoint Online への移行のためにアプリケーションを準備するのに最適です。 次の手順では、テナントのフル コントロールアクセス許可を使用してアプリ プリンシパルを設定する方法を示しますが、この方法を使用して読み取りアクセス許可のみを付与することもできます。

重要

SharePoint Online 用の Azure ACS (Access Control Services) の使用は、2023 年 11 月 27 日の時点で廃止されました。詳細については、完全な廃止のお知らせをご覧ください。 SharePoint のコンテキストの外部で Azure ACS を使用することは、2018 年 11 月 7 日に既に廃止されており、現在は終了です。

廃止とは、機能が新しい投資を受け取ることを意味しますが、まだサポートされています。 有効期間が終了すると、この機能は廃止され、使用できなくなります。

新しいテナントでは、ACS アプリ専用アクセス トークンを使用するアプリは既定で無効になっています。 最新で安全性の高い Azure AD アプリ専用モデルを使用することをお勧めします。 ただし、'set-spotenant -DisableCustomAppAuthentication $false' を実行して動作を変更できます (最新の SharePoint 管理者 PowerShell が必要です)。

テナントのアクセス許可を持つアプリ専用プリンシパルの設定

注:

サイト コレクション管理者は、SharePoint テナント管理者によって明示的に許可されていない限り、既定で AppRegNew.aspx で Azure ACS にアドインを登録できません。詳細については、「 Set-SPOTenant」を参照してください。

テナント内のサイト (などhttps://contoso.sharepoint.com) に移動し、appregnew.aspx ページ (例: ) を呼び出します。 https://contoso.sharepoint.com/_layouts/15/appregnew.aspx このページで、[生成] ボタンをクリックしてクライアント ID とクライアント シークレットを生成し、以下に示されているスクリーン ショットのように、残りの情報を入力します。

新しいクライアント ID & シークレットを作成する

重要

次の手順で必要になるため、取得した情報 (クライアント ID およびクライアント シークレット) を保存します。

次の手順では、新しく作成されたプリンシパルにアクセス許可を付与します。 テナント スコープのアクセス許可を付与しようとしているので、この付与はテナント管理サイトの appinv.aspx ページを介してのみ行えます。 https://contoso-admin.sharepoint.com/_layouts/15/appinv.aspx を介してこのサイトに到達することができます。 ページが読み込まれたら、クライアント ID を追加して、作成されたプリンシパルを検索します。

新しいプリンシパルにアクセス許可を付与する

アクセス許可を付与するために、必要なアクセス許可を記述するアクセス許可 XML を提供する必要があります。 このアプリケーションは、すべてのサイトにアクセス可能である必要があるため、また、アプリ専用を使用した検索を行うため、以下のアクセス許可を必要とします。

<AppPermissionRequests AllowAppOnlyPolicy="true">
  <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
</AppPermissionRequests>

[作成] をクリックすると、アクセス許可の許諾ダイアログが表示されます。 [信頼する] を押して、アクセス許可を付与します。

appregnew.aspx を使用する

重要

作成したクライアント ID とクライアント シークレットは、Administrator アカウントと同様、漏えいすることのないよう注意してください。 このクライアント ID とクライアント シークレットを使用して、SharePoint Online 環境のすべてのデータの読み取りおよび更新を行うことができます。

準備作業が完了したら、次に進みましょう。次の章では、クライアント ID とクライアント シークレットの組み合わせで、作成したアプリ プリンシパルをどのように使用できるかを示します。

PnP PowerShell でこのプリンシパルを使用する

生成されたアプリのみの登録を PnP PowerShellで使用するには、次のようにして SharePoint のオンプレミスまたはオンライン環境に接続します:

Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/demo -ClientId [Your Client ID] -ClientSecret "[Your Client Secret]"

注:

PnP PowerShell はオープン ソース ソリューションであり、アクティブなコミュニティでサポートが提供されています。 Microsoft からのオープン ソース ツールのサポート SLA はありません。

PnP Framework ライブラリを使用してアプリケーションでこのプリンシパルを使用する

最初の手順では、PnP Framework ライブラリ nuget パッケージを追加します。 https://www.nuget.org/packages/PnP.Framework 完了したら、次のコードコンストラクトを使用できます。

string siteUrl = "https://contoso.sharepoint.com/sites/demo";
using (var cc = new AuthenticationManager().GetACSAppOnlyContext(siteUrl, "[Your Client ID]", "[Your Client Secret]"))
{
    cc.Load(cc.Web, p => p.Title);
    cc.ExecuteQuery();
    Console.WriteLine(cc.Web.Title);
};

PnP Framework ライブラリを使用せずにアプリケーションでこのプリンシパルを使用する

プリンシパルが作成され、許諾されたら、プリンシパルの ID およびシークレットを使用してアクセスを要求できます。 TokenHelper.cs クラスは、アプリケーションの構成ファイルの ID とシークレットを使用します。

using Microsoft.SharePoint.Client;
using System;

namespace AzureACSAuth
{
    class Program
    {
        static void Main(string[] args)
        {
            string siteUrl = "https://contoso.sharepoint.com/sites/demo";

            //Get the realm for the URL
            string realm = TokenHelper.GetRealmFromTargetUrl(new Uri(siteUrl));

            //Get the access token for the URL.  
            string accessToken = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, new Uri(siteUrl).Authority, realm).AccessToken;

            //Create a client context object based on the retrieved access token
            using (ClientContext cc = TokenHelper.GetClientContextWithAccessToken(siteUrl, accessToken))
            {
                cc.Load(cc.Web, p => p.Title);
                cc.ExecuteQuery();
                Console.WriteLine(cc.Web.Title);
            }
        }
    }
}

サンプルの app.config は、次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- Use AppRegNew.aspx and AppInv.aspx to register client id with secret -->
    <add key="ClientId" value="[Your Client ID]" />
    <add key="ClientSecret" value="[Your Client Secret]" />
  </appSettings>
</configuration>

注:

ソリューションに AppForSharePointOnlineWebToolkit NuGet パッケージを追加することで、TokenHelper.cs クラスをプロジェクトに簡単に挿入することができます。