cURL で ASP.NET Core の Web API を呼び出す

この記事では、Client URL (cURL) を使用して保護された ASP.NET Core の Web API を呼び出す方法について説明します。 cURLは、開発者がサーバーとの間でデータを転送するために使用するコマンド ライン ツールです。 この記事では、テナントで Web アプリと Web API を登録します。 Web アプリは、Microsoft ID プラットフォームによって生成されたアクセス トークンを取得するために使用します。 次にこのトークンを使って、cURL を使用して Web API に承認された呼び出しを行います。

この記事では、Client URL (cURL) を使用して保護された ASP.NET Core の Web API を呼び出す方法について説明します。 cURLは、開発者がサーバーとの間でデータを転送するために使用するコマンド ライン ツールです。 「チュートリアル: API に保護されたエンドポイントを実装する」では保護された API を作成しましたが、その後に Web アプリケーションを Microsoft ID プラットフォームに登録してアクセス トークンを生成する必要があります。 次にこのトークンを使って、cURL を使用して API に承認された呼び出しを行います。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます
  • この Azure アカウントには、アプリケーションを管理するためのアクセス許可が必要です。 以下のいずれの Microsoft Entra ロールにも、必要なアクセス許可が含まれています。
    • アプリケーション管理者
    • アプリケーション開発者
    • クラウド アプリケーション管理者
  • お使いのワークステーション コンピューターに cURL をダウンロードしてインストールします。
  • .NET 8.0 SDK の最小要件。

Microsoft ID プラットフォームにアプリケーションを登録する

Microsoft ID プラットフォームでは、ID およびアクセス管理サービスを利用する前に、アプリケーションを登録する必要があります。 アプリケーションの登録では、アプリケーションの名前と種類とサインイン対象ユーザーを指定できます。 サインイン対象ユーザーは、特定のアプリケーションにサインインできるユーザー アカウントの種類を指定します。

Web API を登録する

ヒント

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

Web API の登録を作成するには、次の手順のようにします。

  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 にスコープを追加するときのフィールド値を示すスクリーンショット。

Web アプリを登録する

ただし、Web API があるだけでは不十分で、作成した Web API にアクセスするためのアクセス トークンを取得する Web アプリも必要です。

Web アプリの登録を作成するには、次の手順のようにします。

  1. [ホーム] を選択してホーム ページに戻ります。 [ID]>[アプリケーション]>[アプリの登録] を参照します。
  2. [新規登録] を選択します。
  3. アプリケーションの名前 (web-app-calls-web-api など) を入力します。
  4. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。 さまざまなアカウントの種類の詳細については、[選択に関するヘルプ] オプションを選択します。
  5. [リダイレクト URI (省略可能)] で、[Web] を選択し、URL テキスト ボックスに「http://localhost」と入力します。
  6. [登録] を選択します。
  1. アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。
  2. 複数のテナントにアクセスできる場合は、上部のメニューの [設定] アイコン を使い、[ディレクトリとサブスクリプション] メニューからアプリケーションを登録するテナントに切り替えます。
  3. [ID]>[アプリケーション]>[アプリの登録] を参照します。
  4. [新規登録] を選択します。
  5. アプリケーションの名前 (web-app-calls-web-api など) を入力します。
  6. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。 さまざまなアカウントの種類の詳細については、[選択に関するヘルプ] オプションを選択します。
  7. [リダイレクト URI (省略可能)] で、[Web] を選択し、URL テキスト ボックスに「http://localhost」と入力します。
  8. [登録] を選択します。

登録が完了すると、アプリの登録が [概要] ペインに表示されます。 ディレクトリ (テナント) IDアプリケーション (クライアント) ID は、後の手順で使用するので記録しておきます。

クライアント シークレットの追加

クライアント シークレットは、アプリが自分自身を識別するために使用できる文字列値であり、" アプリケーション パスワード"と呼ばれることもあります。 Web アプリは、トークンを要求するときに、このクライアント シークレットを使用してその ID を証明します。

次の手順に従って、クライアント シークレットを構成します。

  1. [概要] ペインの [管理] で、[証明書とシークレット]>[クライアント シークレット]>[新しいクライアント シークレット] の順に選択します。

  2. クライアント シークレットの説明 (例: 自分のクライアント シークレット) を追加します。

  3. シークレットの有効期限を選択するか、カスタムの有効期間を指定します。

    • クライアント シークレットの有効期間は、2 年間 (24 か月) 以内に制限されています。 24 か月を超えるカスタムの有効期間を指定することはできません。
    • Microsoft では、有効期限の値は 12 か月未満に設定することをお勧めしています。
  4. [追加] を選択します。

  5. クライアント シークレットのは必ず記録しておいてください。 このページからの移動後は、このシークレットの値は "二度と表示されません"。

Web API へのアクセスを許可するアプリケーションのアクセス許可を追加する

Web アプリの登録で Web API のスコープを指定することにより、Web アプリは Microsoft ID プラットフォームが提供するスコープを含むアクセス トークンを取得することができます。 次にコード内で、Web API はアクセス トークンに含まれるスコープに基づいて、リソースに対するアクセス許可ベースのアクセスを提供することができます。

次の手順に従って、Web API に対する Web アプリのアクセス許可を構成します。

  1. Web アプリケーション (web-app-that-calls-web-api) の [概要] ペインにある [管理] で、[API のアクセス許可]>[アクセス許可の追加]>[所属する組織で使用している API] の順に選択します。
  2. NewWebAPI1 またはアクセス許可を追加したい API を選択します。
  3. [アクセス許可を選択] で、Forecast.Read の横にあるボックスをチェックします。 [アクセス許可] の一覧を展開する必要があるかもしれません。 これにより、サインインしているユーザーに代わってクライアント アプリがもつべきアクセス許可が選択されます。
  4. [アクセス許可の追加] を選択してプロセスを完了します。

これらのアクセス許可をご自身の API に追加した後、選択したアクセス許可が [構成されたアクセス許可] に表示されます。

Microsoft Graph API に対する User.Read アクセス許可も表示されています。 このアクセス許可は、アプリを登録すると自動的に追加されます。

Web API をテストする

  1. ms-identity-docs-code-dotnet リポジトリを複製します。

    git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git 
    
  2. ms-identity-docs-code-dotnet/web-api フォルダーに移動し、./appsettings.json ファイルを開き、{APPLICATION_CLIENT_ID}{DIRECTORY_TENANT_ID} を以下のように置き換えます。

    • {APPLICATION_CLIENT_ID} は、アプリの [概要] ペインの [アプリの登録] にある Web API アプリケーション (クライアント) ID です。
    • {DIRECTORY_TENANT_ID} は、アプリの [概要] ペインの [アプリの登録] にある Web API ディレクトリ (テナント) ID です。
  3. 次のコマンドを実行して、アプリを起動します。

    dotnet run
    
  4. 次のような出力が表示されます。 ポート番号を https://localhost:{port} URL に記録します。

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

Web API をテストする

  1. チュートリアル: ASP.NET Core プロジェクトを作成し、API を構成する」で作成した Web API (たとえば NewWebAPILocal) に移動し、フォルダーを開きます。

  2. 新しいターミナル ウィンドウを開き、Web API プロジェクトが置いてあるフォルダーに移動します。

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

    dotnet run
    
  1. 次のような出力が表示されます。 ポート番号を https://localhost:{port} URL に記録します。

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

承認コードを要求する

承認コード フローは、クライアントがユーザーを /authorize エンドポイントにリダイレクトさせることから始まります。 この要求では、クライアントは、ユーザーからの Forecast.Read のアクセス許可を要求します。

https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize?client_id={web-app-calls-web-api_application_client_id}&response_type=code&redirect_uri=http://localhost&response_mode=query&scope=api://{web_API_application_client_id}/Forecast.Read
  1. URL をコピーし、次のパラメーターを置き換えてブラウザーに貼り付けます。

    • {tenant_id} は Web アプリ Directory (tenant) ID です。
    • {web-app-calls-web-api_application_client_id} は、Web アプリの (web-app-calls-web-api) [概要] ペインのアプリケーション (クライアント) ID です。
    • {web_API_application_client_id} は、Web API の (NewWebAPI1) [概要] ペインのアプリケーション (クライアント) ID です。
  2. アプリが登録されている Microsoft Entra テナントでユーザーとしてサインインします。 必要に応じて、アクセス時に求められる事項に同意します。

  3. ブラウザーが http://localhost/ にリダイレクトされます。 ブラウザーのナビゲーション バーを参照し、次の手順で使用する {authorization_code} をコピーします。 URL は、次のスニペットの形式になります。

    http://localhost/?code={authorization_code}
    

承認コードと cURL を使用してアクセス トークンを取得する

cURL を使用して、Microsoft ID プラットフォームからアクセス トークンを要求できるようになりました。

  1. 次のスニペットで cURL コマンドをコピーします。 かっこ内の値を、ターミナルに合わせて次のパラメーターに置き換えます。 かっこは必ず削除してください。

    curl -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token \
    -d 'client_id={web-app-calls-web-api_application_client_id}' \
    -d 'api://{web_API_application_client_id}/Forecast.Read' \
    -d 'code={authorization_code}&session_state={web-app-calls-web-api_application_client_id}' \
    -d 'redirect_uri=http://localhost' \
    -d 'grant_type=authorization_code' \
    -d 'client_secret={client_secret}'
    
    • {tenant_id} は Web アプリ Directory (tenant) ID です。
    • client_id={web-app-calls-web-api_application_client_id}session_state={web-app-calls-web-api_application_client_id} は、Web アプリの (web-app-calls-web-api) [概要] ペインのアプリケーション (クライアント) ID です。
    • api://{web_API_application_client_id}/Forecast.Read は、Web API の (NewWebAPI1) [概要] ペインのアプリケーション (クライアント) ID です。
    • code={authorization_code} は、「承認コードを要求する」で受信した承認コードです。 これにより、cURL ツールはアクセス トークンを要求できます。
    • client_secret={client_secret} は、「クライアント シークレットを追加する」で記録したクライアント シークレットのです。
  2. cURL コマンドを実行します。正しく入力すると、次の出力のような JSON 応答が表示されます。

    {
       "token_type": "Bearer",
       "scope": "api://{web_API_application_client_id}/Forecast.Read",
       "expires_in": 3600,
       "ext_expires_in": 3600,
       "access_token": "{access_token}"
    }
    

アクセス トークンを使用して Web API を呼び出す

前の cURL コマンドを実行すると、Microsoft ID プラットフォームによってアクセス トークンが提供されました。 取得したトークンを HTTP 要求のベアラーとして使用して、Web API を呼び出せるようになりました。

  1. Web API を呼び出すには、次の cURL コマンドをコピーし、かっこ内の次の値を置き換えて、ターミナルに貼り付けます。

    curl -X GET https://localhost:{port}/weatherforecast -ki \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer {access_token}"
    
    • {access_token} 前のセクションの JSON 出力から記録されたアクセス トークン値。
    • {port} ターミナルで API を実行するときに記録された Web API からのポート番号。 https ポート番号であることを確認します。
  2. 要求に有効なアクセス トークンが含まれている場合、想定される応答は HTTP/2 200 で、出力は次のようになります。

    HTTP/2 200
    content-type: application/json; charset=utf-8
    date: Day, DD Month YYYY HH:MM:SS
    server: Kestrel
    [{"date":"YYYY-MM-DDTHH:MM:SS","temperatureC":36,"summary":"Hot","temperatureF":96},{"date":"YYYY-MM-DDTHH:MM:SS","temperatureC":43,"summary":"Warm","temperatureF":109},{"date":"YYYY-MM-DDTHH:MM:SS","temperatureC":18,"summary":"Warm","temperatureF":64},{"date":"YYYY-MM-DDTHH:MM:SS","temperatureC":50,"summary":"Chilly","temperatureF":121},{"date":"YYYY-MM-DDTHH:MM:SS","temperatureC":3,"summary":"Bracing","temperatureF":37}]
    

次の手順

OAuth 2.0 の承認コード フローとアプリケーションの種類の詳細については、以下を参照してください。