クイックスタート:Microsoft ID プラットフォームを使用して ASP.NET Core Web API を保護する

このクイックスタートでは、ASP.NET Core Web API コード サンプルを使って、リソースへのアクセスを承認されたアカウントに制限する方法を示します。 このサンプルでは、Microsoft Authentication Library (MSAL) とやり取りして認証を処理する ASP.NET Core Identity を使います。

前提条件

アプリケーションとレコードの識別子を登録する

ヒント

この記事の手順は、開始するポータルによって若干異なる場合があります。

登録を完了するには、アプリケーションに名前を指定し、サポートされているアカウントの種類を指定します。 登録すると、アプリケーションの [概要] ページに、アプリケーションのソース コードに必要な識別子が表示されます。

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

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

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

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

  5. アプリケーションの名前 (NewWebAPI1 など) を入力します。

  6. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。 さまざまなアカウントの種類については、[選択に関するヘルプ] オプションを選択します。

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

    名前を入力し、アカウントの種類を選択する方法を示すスクリーンショット。

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

    概要ページの識別子の値を示すスクリーンショット。

注意

サポートされているアカウントの種類は、「アプリケーションによってサポートされるアカウントを変更する」を参照して変更することができます。

API の公開

API が登録されると、API がクライアント アプリケーションに公開するスコープを定義することで、そのアクセス許可を構成することができます。 クライアント アプリケーションは、アクセス トークンとその要求を保護された Web API に渡すことで、操作を実行するためのアクセス許可を要求します。 そして Web API は、受け取ったアクセス トークンに必要なスコープが含まれている場合のみ、要求された操作を実行します。

  1. [管理] で、[API の公開] > [スコープの追加] の順に選択します。 提案されたアプリケーション ID URI(api://{clientId}) を受け入れるには、[保存して続行] を選択します。 {clientId} は、[概要] ページから記録した値です。 そして、次の情報を入力します。

    1. [スコープ名] に「Forecast.Read」と入力します。
    2. [同意できるユーザー][管理者とユーザー] オプションが選択されていることを確認します。
    3. [管理者の同意の表示名] ボックスには、「Read forecast data」と入力します。
    4. [管理者の同意の説明] ボックスには、「Allows the application to read weather forecast data」と入力します。
    5. [ユーザーの同意の表示名] ボックスには、「Read forecast data」と入力します。
    6. [ユーザーの同意の説明] ボックスには、「Allows the application to read weather forecast data」と入力します。
    7. [状態][有効] に設定されていることを確認します。
  2. [スコープの追加] を選択します。 スコープが正しく入力されている場合は、[API の公開] ペインに一覧表示されます。

    API にスコープを追加するときのフィールド値を示すスクリーンショット。

サンプル アプリケーションをクローンまたはダウンロードする

サンプル アプリケーションを取得するには、GitHub から複製するか、.zip ファイルとしてダウンロードします。

  • サンプルをクローンするには、コマンド プロンプトを開き、プロジェクトを作成する場所に移動し、次のコマンドを入力します。

    git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git
    
  • .zip ファイルをダウンロードします。 名前の長さが 260 文字未満のファイル パスに抽出します。

ASP.NET Core サンプル アプリケーションを構成する

  1. IDE で、サンプルが含まれているプロジェクト フォルダー ms-identity-docs-code-dotnet/web-api を開きます。

  2. 次のコード スニペットを含む appsettings.json ファイルを開きます。

    {
      "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "Enter the tenant ID obtained from the Microsoft Entra admin center",
        "ClientId": "Enter the client ID obtained from the Microsoft Entra admin center",
        "Scopes": "Forecast.Read"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    

    次の key を見つけます。

    • ClientId - クライアントとも呼ばれる、アプリケーションの識別子。 引用符で囲まれた value テキストを、登録したアプリケーションの [概要] ページから先ほど記録したアプリケーション (クライアント) ID に置き換えます。
    • TenantId - アプリケーションが登録されているテナントの識別子。 引用符で囲まれた value テキストを、登録したアプリケーションの [概要] ページから先ほど記録したディレクトリ (テナント) ID の値に置き換えます。

サンプル アプリケーションの実行

  1. 次のコマンドを実行して、アプリを起動します。

    dotnet run
    
  2. 次のサンプルのような出力が表示されます。

    ...
    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: https://localhost:{port}
    ...
    

    ポート番号を https://localhost:{port} URL に記録します。

  3. エンドポイントが保護されていることを確認するには、Bash で次の cURL コマンドを使って、認証されていない HTTP GET 要求を送信します。

    curl -X GET https://localhost:5001/weatherforecast -ki
    

    予期される応答は 401 Unauthorized で、出力は次のようになります。

    user@host:~$ curl -X GET https://localhost:5001/weatherforecast -ki
    HTTP/2 401
    date: Fri, 23 Sep 2023 23:34:24 GMT
    server: Kestrel
    www-authenticate: Bearer
    content-length: 0