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 このページでは、次のスクリーン ショットに示すように、残りの情報を入力します。
重要
キーを押 Create
すと、クライアント 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>
[作成] をクリックすると、アクセス許可の許諾ダイアログが表示されます。 [信頼する] を押して、アクセス許可を付与します。
重要
作成したクライアント 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 クラスをプロジェクトに簡単に挿入することができます。