次の方法で共有


保護された ASP.NET Core Web API をテストする

適用対象: 白いチェック マーク記号が付いた緑の円。 従業員テナント 白いチェック マーク記号が付いた緑の円。 外部テナント (詳細はこちら)

このチュートリアルは、Microsoft Entra テナントに登録されている保護された Web API の構築とテストを示すシリーズの最後の部分です。 このシリーズのパート 1 では、ASP.NET Core Web API を作成し、そのエンドポイントを保護しました。 次に、軽量デーモン アプリを作成し、テナントに登録し、デーモン アプリを使用して構築した Web API をテストします。

このチュートリアルでは、次の操作を行います。

  • デーモン アプリを登録する
  • デーモン アプリにアプリ ロールを割り当てる
  • デーモン アプリをビルドする
  • デーモン アプリを実行して保護された Web API を呼び出す

前提条件

デーモン アプリを登録する

次の手順は、Microsoft Entra 管理センターでデーモン アプリを登録する方法を示しています。

  1. アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。

  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコン を使用し、[ディレクトリとサブスクリプション] メニューから外部テナントに切り替えます。

  3. Entra ID>アプリ登録に移動します。

  4. [+ 新規登録] を選択します。

  5. 表示される [アプリケーションの登録] ページで、アプリケーションの登録情報を入力します。

    1. [名前] セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名 ("ciam-client-app" など) を入力します。

    2. [サポートされているアカウントの種類] で、[この組織のディレクトリ内のアカウントのみ] を選択します。

  6. 登録 を選択します。

  7. 登録が完了すると、アプリケーションの [概要] ペインが表示されます。 ディレクトリ (テナント) ID と、アプリケーションのソース コードで使用する アプリケーション (クライアント) ID を記録します。

登録したアプリケーションに対してクライアント シークレットを作成します。 アプリケーションは、トークンの要求時にクライアント シークレットを使用して ID を証明します。

  1. [ アプリの登録 ] ページで、作成したアプリケーション ( Web アプリ クライアント シークレットなど) を選択して [概要 ] ページを開きます。
  2. [管理] で、[証明書とシークレット]>[クライアント シークレット]>[新しいクライアント シークレット] の順に選択します。
  3. [ 説明 ] ボックスに、クライアント シークレットの説明 ( Web アプリ クライアント シークレットなど) を入力します。
  4. [有効期限] で、シークレットが (組織のセキュリティ規則に基づいて) 有効な期間を選択してから、[追加] を選択します。
  5. シークレットのを記録します。 この値は、後の手順で構成に使用します。 シークレットの値は再表示されず、[証明書とシークレット] から移動した後はどのような手段でも取得できません。 必ず記録しておくようにしてください。

デーモン アプリにアプリ ロールを割り当てる

ユーザーなしで自分で認証するアプリケーションには、アプリのアクセス許可 (ロールとも呼ばれます) が必要です。 これらのアクセス許可により、アプリ自体はリソースに直接アクセスできます。 一方、サインインしているユーザーで API をテストする場合は、委任されたアクセス許可 (スコープ) を割り当てます。 委任されたアクセス許可により、アプリはユーザーのアクセス権に限定され、ユーザーに代わって動作できるようになります。 デーモン アプリにアプリケーションのアクセス許可を割り当てるには、次の手順に従います。

  1. [アプリの登録] ページから、作成したアプリケーション (ciam-client-app など) を選択します。

  2. [管理] で API 許可を選択します。

  3. [構成されたアクセス許可] の下で [アクセス許可の追加] を選択します。

  4. [所属する組織で使用している API] タブを選択します。

  5. API の一覧で、API (ciam-ToDoList-api など) を選択します。

  6. [アプリケーションのアクセス許可] オプションを選択します。 このアプリは、ユーザーの代理としてではなくそれ自体がサインインするものであるため、このオプションを選びます。

  7. アクセス許可の一覧から、TodoList.Read.All と ToDoList.ReadWrite.All を選択します (必要に応じて検索ボックスを使用してください)。

  8. [アクセス許可の追加] ボタンを選択します。

  9. この時点で、アクセス許可が正しく割り当てられました。 ただし、デーモン アプリはユーザーが対話することを許可しないため、ユーザー自身がこれらのアクセス許可に同意することはできません。 この問題に対処するには、管理者が次のように、テナント内のすべてのユーザーに代わってこれらのアクセス許可に同意する必要があります。

    1. [<テナント名> に管理者の同意を与えます] を選択してから、[はい] を選択します。
    2. [最新の情報に更新] を選択してから、両方のアクセス許可の < に [>テナント名 に付与されました] と表示されていることを確認します。

デーモン アプリをビルドする

  1. .NET コンソール アプリを初期化し、そのルート フォルダーに移動します。

    dotnet new console -o MyTestApp
    cd MyTestApp
    
  2. 次のコマンドを実行して、認証の処理に役立つ MSAL.NET をインストールします。

    dotnet add package Microsoft.Identity.Client
    
  3. API プロジェクトを実行し、それが実行されているポートをメモします。

  4. "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 (応答: 未承認)" がコンソールに出力されます。

  5. 手順 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);
    
  6. コード内のプレースホルダーを、デーモン アプリのクライアント ID、シークレット、Web API アプリケーション ID、テナント名に置き換えます。

    • 外部テナントの場合は、オーソリティを次の形式で使用します: "https://{tenantName}.ciamlogin.com/"
    • 従業員テナントの場合は、オーソリティを次の形式で使用します: "https://login.microsoftonline.com/{tenantId}"
  7. デーモン アプリのルート ディレクトリに移動し、コマンド dotnet run を使用してアプリを実行します。 このコードは、アクセス トークン付きで要求を送信します。 文字列 "Your response is: OK (応答: OK)" がコンソールに出力されます。