保護された API をテストする
このチュートリアルは、外部テナントに登録される保護された Web API を構築してテストする方法を見ていくシリーズの最後のパートです。 このシリーズのパート 1 では、ASP.NET Core Web API を作成し、そのエンドポイントを保護しました。 この最後の手順では、デーモン アプリを登録し、API をテストします。
このチュートリアルでは、次の作業を行う方法について説明します。
- Web API を呼び出す軽量デーモン アプリを使用して、保護された Web API をテストする
前提条件
チュートリアル: 外部テナントに登録されている ASP.NET Core Web API をセキュリティで保護する
デーモン アプリを登録する
Microsoft Entra 管理センターにデーモン アプリを登録する方法を次の手順に示します。
アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。
複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコン を使用し、[ディレクトリとサブスクリプション] メニューから外部テナントに切り替えます。
[ID]>[アプリケーション]>[アプリの登録] を参照します。
[+ 新規登録] を選択します。
表示される [アプリケーションの登録] ページで、アプリケーションの登録情報を入力します。
[名前] セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名 ("ciam-client-app" など) を入力します。
[サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。
[登録] を選択します。
登録が完了すると、アプリケーションの [概要] ペインが表示されます。 アプリケーションのソース コードで使用するディレクトリ (テナント) ID とアプリケーション (クライアント) ID を記録します。
登録したアプリケーションに対してクライアント シークレットを作成します。 Web アプリケーションでは、トークンを要求するときに、このクライアント シークレットを使って自身の ID を証明します。
- [アプリの登録] ページで、作成したアプリケーション ("ciam-client-app" など) を選択して、その [概要] ページを開きます。
- [管理] で、[証明書とシークレット] を選択します。
- [新しいクライアント シークレット] を選択します。
- [説明] ボックスにクライアント シークレットの説明を入力します (例、ciam app client secret)。
- [有効期限] で、シークレットが (組織のセキュリティ規則に基づいて) 有効な期間を選択してから、[追加] を選択します。
- シークレットの値を記録します。 この値は、後の手順での構成に使用します。 シークレットの値は再表示されず、[証明書とシークレット] から移動した後はどのような手段でも取得できません。 必ず記録しておくようにしてください。
デーモン アプリにアプリ ロールを割り当てる
自身を認証するアプリには、アプリのアクセス許可が必要です。
[アプリの登録] ページで、作成したアプリケーション ("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 をインストールします。
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("https://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 tenantName= "<your-tenant-name>"; var authority = $"https://{tenantName}.ciamlogin.com/"; var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithAuthority(authority) .WithClientSecret(clientSecret) .Build(); var result = await app.AcquireTokenForClient(scopes).ExecuteAsync(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); var response = await client.GetAsync("https://localhost:44351/api/todolist"); Console.WriteLine("Your response is: " + response.StatusCode);
デーモン アプリのルート ディレクトリに移動し、コマンド
dotnet run
を使用してアプリを実行します。 このコードは、アクセス トークン付きで要求を送信します。 文字列 "Your response is: OK (応答: OK)" がコンソールに出力されます。