適用対象: 従業員テナント
外部テナント (詳細はこちら)
このチュートリアルは、Microsoft Entra テナントに登録されている保護された Web API の構築とテストを示すシリーズの最後の部分です。 このシリーズのパート 1 では、ASP.NET Core Web API を作成し、そのエンドポイントを保護しました。 次に、軽量デーモン アプリを作成し、テナントに登録し、デーモン アプリを使用して構築した Web API をテストします。
このチュートリアルでは、次の操作を行います。
- デーモン アプリを登録する
- デーモン アプリにアプリ ロールを割り当てる
- デーモン アプリをビルドする
- デーモン アプリを実行して保護された Web API を呼び出す
前提条件
- まだ行っていない場合は、「チュートリアル: Microsoft ID プラットフォームを使用して ASP.NET Core Web API を構築して保護する」を完了します
デーモン アプリを登録する
次の手順は、Microsoft Entra 管理センターでデーモン アプリを登録する方法を示しています。
アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。
複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコン
を使用し、[ディレクトリとサブスクリプション] メニューから外部テナントに切り替えます。
Entra ID>アプリ登録に移動します。
[+ 新規登録] を選択します。
表示される [アプリケーションの登録] ページで、アプリケーションの登録情報を入力します。
[名前] セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名 ("ciam-client-app" など) を入力します。
[サポートされているアカウントの種類] で、[この組織のディレクトリ内のアカウントのみ] を選択します。
登録 を選択します。
登録が完了すると、アプリケーションの [概要] ペインが表示されます。
ディレクトリ (テナント) ID と、アプリケーションのソース コードで使用するアプリケーション (クライアント) ID を記録します。
登録したアプリケーションに対してクライアント シークレットを作成します。 アプリケーションは、トークンの要求時にクライアント シークレットを使用して ID を証明します。
- [ アプリの登録 ] ページで、作成したアプリケーション ( Web アプリ クライアント シークレットなど) を選択して [概要 ] ページを開きます。
- [管理] で、[証明書とシークレット]>[クライアント シークレット]>[新しいクライアント シークレット] の順に選択します。
- [ 説明 ] ボックスに、クライアント シークレットの説明 ( Web アプリ クライアント シークレットなど) を入力します。
- [有効期限] で、シークレットが (組織のセキュリティ規則に基づいて) 有効な期間を選択してから、[追加] を選択します。
- シークレットの値を記録します。 この値は、後の手順で構成に使用します。 シークレットの値は再表示されず、[証明書とシークレット] から移動した後はどのような手段でも取得できません。 必ず記録しておくようにしてください。
デーモン アプリにアプリ ロールを割り当てる
ユーザーなしで自分で認証するアプリケーションには、アプリのアクセス許可 (ロールとも呼ばれます) が必要です。 これらのアクセス許可により、アプリ自体はリソースに直接アクセスできます。 一方、サインインしているユーザーで API をテストする場合は、委任されたアクセス許可 (スコープ) を割り当てます。 委任されたアクセス許可により、アプリはユーザーのアクセス権に限定され、ユーザーに代わって動作できるようになります。 デーモン アプリにアプリケーションのアクセス許可を割り当てるには、次の手順に従います。
[アプリの登録] ページから、作成したアプリケーション (ciam-client-app など) を選択します。
[管理] で API 許可を選択します。
[構成されたアクセス許可] の下で [アクセス許可の追加] を選択します。
[所属する組織で使用している API] タブを選択します。
API の一覧で、API (ciam-ToDoList-api など) を選択します。
[アプリケーションのアクセス許可] オプションを選択します。 このアプリは、ユーザーの代理としてではなくそれ自体がサインインするものであるため、このオプションを選びます。
アクセス許可の一覧から、TodoList.Read.All と ToDoList.ReadWrite.All を選択します (必要に応じて検索ボックスを使用してください)。
[アクセス許可の追加] ボタンを選択します。
この時点で、アクセス許可が正しく割り当てられました。 ただし、デーモン アプリはユーザーが対話することを許可しないため、ユーザー自身がこれらのアクセス許可に同意することはできません。 この問題に対処するには、管理者が次のように、テナント内のすべてのユーザーに代わってこれらのアクセス許可に同意する必要があります。
- [<テナント名> に管理者の同意を与えます] を選択してから、[はい] を選択します。
- [最新の情報に更新] を選択してから、両方のアクセス許可の < に [>テナント名 に付与されました] と表示されていることを確認します。
デーモン アプリをビルドする
.NET コンソール アプリを初期化し、そのルート フォルダーに移動します。
dotnet new console -o MyTestApp cd MyTestApp
次のコマンドを実行して、認証の処理に役立つ MSAL.NET をインストールします。
dotnet add package Microsoft.Identity.Client
API プロジェクトを実行し、それが実行されているポートをメモします。
"Program.cs" ファイルを開き、"Hello world" コードを次のコードに置き換えます。
using System; using System.Net.Http; using System.Net.Http.Headers; HttpClient client = new HttpClient(); var response = await client.GetAsync("http://localhost:<your-api-port>/api/todolist); Console.WriteLine("Your response is: " + response.StatusCode);
デーモン アプリのルート ディレクトリに移動し、コマンド
dotnet run
を使用してアプリを実行します。 このコードは、アクセス トークンなしで要求を送信します。 文字列 "Your response is: Unauthorized (応答: 未承認)" がコンソールに出力されます。手順 4 のコードを削除し、次に置き換えて、有効なアクセス トークンで要求を送信して API をテストします。 このデーモン アプリは、ユーザーの操作なしで認証を行う際に、クライアント資格情報フローを使用してアクセス トークンを取得します。
using Microsoft.Identity.Client; using System; using System.Net.Http; using System.Net.Http.Headers; HttpClient client = new HttpClient(); var clientId = "<your-daemon-app-client-id>"; var clientSecret = "<your-daemon-app-secret>"; var scopes = new[] {"api://<your-web-api-application-id>/.default"}; var tenantId = "<your-tenant-id>"; //Use in workforce tenant configuration var tenantName = "<your-tenant-name>"; //Use in external tenant configuration var authority = $"https://login.microsoftonline.com/{tenantId}"; // Use "https://{tenantName}.ciamlogin.com" for external tenant configuration var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithAuthority(authority) .WithClientSecret(clientSecret) .Build(); var result = await app.AcquireTokenForClient(new string[] { scopes }).ExecuteAsync(); Console.WriteLine($"Access Token: {result.AccessToken}"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); var response = await client.GetAsync("http://localhost:/<your-api-port>/api/todolist"); var content = await response.Content.ReadAsStringAsync(); Console.WriteLine("Your response is: " + response.StatusCode); Console.WriteLine(content);
コード内のプレースホルダーを、デーモン アプリのクライアント ID、シークレット、Web API アプリケーション ID、テナント名に置き換えます。
- 外部テナントの場合は、オーソリティを次の形式で使用します:
"https://{tenantName}.ciamlogin.com/"
- 従業員テナントの場合は、オーソリティを次の形式で使用します:
"https://login.microsoftonline.com/{tenantId}"
- 外部テナントの場合は、オーソリティを次の形式で使用します:
デーモン アプリのルート ディレクトリに移動し、コマンド
dotnet run
を使用してアプリを実行します。 このコードは、アクセス トークン付きで要求を送信します。 文字列 "Your response is: OK (応答: OK)" がコンソールに出力されます。