保護された API をテストする

このチュートリアルは、外部テナントに登録される保護された Web API を構築してテストする方法を見ていくシリーズの最後のパートです。 このシリーズのパート 1 では、ASP.NET Core Web API を作成し、そのエンドポイントを保護しました。 この最後の手順では、デーモン アプリを登録し、API をテストします。

このチュートリアルでは、次の作業を行う方法について説明します。

  • Web API を呼び出す軽量デーモン アプリを使用して、保護された Web API をテストする

前提条件

チュートリアル: 外部テナントに登録されている ASP.NET Core Web API をセキュリティで保護する

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

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

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

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

  3. [ID]>[アプリケーション]>[アプリの登録] を参照します。

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

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

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

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

  6. [登録] を選択します。

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

登録したアプリケーションに対してクライアント シークレットを作成します。 Web アプリケーションでは、トークンを要求するときに、このクライアント シークレットを使って自身の ID を証明します。

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

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

自身を認証するアプリには、アプリのアクセス許可が必要です。

  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 をインストールします。

    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("https://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 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)" がコンソールに出力されます。

関連項目

セルフサービス パスワード リセットを有効にする