Web API を呼び出す Web API:コード構成

Web API の登録が完了したら、アプリケーション コードを構成できます。 ダウンストリームの Web API を呼び出す Web API は、Web API の保護に使用されるコードに基づいて構成します。 詳細については、保護された Web API: アプリ構成に関するページを参照してください。

Microsoft.Identity.Web

ダウンストリーム Web API を呼び出す ASP.NET Core で保護された API を開発する場合は、Microsoft.Identity.Web NuGet パッケージを使用することをお勧めします。 「保護された Web API: Web API のコンテキストでそのライブラリをすばやく表示するには、コード構成の「Microsoft.Identity.Web」を参照してください。

クライアント シークレットまたはクライアント証明書

ご利用の Web アプリでダウンストリーム Web API を呼び出すことができるようになったため、クライアント シークレットまたはクライアント証明書を appsettings.json ファイルに指定してください。 次を指定するセクションを追加することもできます。

  • ダウンストリーム Web API の URL
  • API の呼び出しに必要なスコープ

次の例では、GraphBeta セクションでこれらの設定を指定しています。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

Note

Azure Kubernetes のワークロード ID フェデレーションのような資格情報のないソリューションなど、クライアント資格情報のコレクションを提案できます。 以前のバージョンの Microsoft.Identity.Web では、"ClientCredentials" ではなく単一のプロパティ "ClientSecret" でクライアント シークレットが表現されていました。 これは下位互換性のために引き続きサポートされていますが、"ClientSecret" プロパティと "ClientCredentials" コレクションの両方を使用することはできません。

クライアント シークレットの代わりに、クライアント証明書を指定することができます。 次のコード スニペットは、Azure Key Vault に格納されている証明書の使用を示しています。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

警告

Scopes を配列に変更することを忘れた場合、IDownstreamApi を使用しようとするとスコープに null が表示され、IDownstreamApi はダウンストリーム API に対して匿名 (非認証) の呼び出しを試み、その結果、401/unauthenticated が発生します。

Microsoft.Identity.Web では、構成またはコードの両方で証明書を記述するいくつかの方法を提供しています。 詳細については、GitHub 上の「Microsoft.Identity.Web - 証明書の使用」を参照してください。

Program.cs

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Web API では、ダウンストリーム API のトークンを取得する必要があります。 これを指定するには、.AddMicrosoftIdentityWebApi(Configuration) の後に .EnableTokenAcquisitionToCallDownstreamApi() 行を追加します。 この行により、コントローラーまたはページのアクションで使用できる ITokenAcquisition サービスが公開されます。

ただし、別の方法として、トークン キャッシュを実装する方法もあります。 たとえば、.AddInMemoryTokenCaches()Program.cs に追加すると、トークンをメモリにキャッシュできます。

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Microsoft.Identity.Web には、別の API からダウンストリーム Web API を呼び出すための 2 つのメカニズムが用意されています。 選択するオプションは、Microsoft Graph または別の API のどちらを呼び出すかによって異なります。

オプション 1: Microsoft Graph の呼び出し

Microsoft Graph を呼び出すために、Microsoft.Identity.Web では、(Microsoft Graph SDK で公開されている) GraphServiceClient を API アクションで直接使用できます。

注意

Microsoft Graph SDK v5 以降には進行中の問題があります。 詳細については、GitHub イシューを参照してください。

Microsoft Graph を公開するには、次の手順を実行します。

  1. Microsoft.Identity.Web.GraphServiceClient NuGet パッケージをプロジェクトに追加します。
  2. Program.cs.EnableTokenAcquisitionToCallDownstreamApi() の後に .AddMicrosoftGraph() を追加します。 .AddMicrosoftGraph() にはいくつかのオーバーライドがあります。 構成セクションをパラメーターとして受け取るオーバーライドを使用すると、コードは次のようになります。
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
    .AddInMemoryTokenCaches();
// ...

オプション 2:Microsoft Graph 以外のダウンストリーム Web API を呼び出す

  1. Microsoft.Identity.Web.DownstreamApi NuGet パッケージをプロジェクトに追加します。
  2. Program.cs.EnableTokenAcquisitionToCallDownstreamApi() の後に .AddDownstreamApi() を追加します。 コードは次のようになります。
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddInMemoryTokenCaches();
// ...

このとき

  • MyApi は、Web API が呼び出す予定のダウンストリーム Web API の名前を示します
  • MyApiScope は、ダウンストリーム Web API と対話するための Web API の要求で必要なスコープです

これらの値は、次のスニペットのような JSON で表されます。

"DownstreamAPI": {
      "BaseUrl": "https://downstreamapi.contoso.com/",
      "Scopes": "user.read"
    },

Web アプリで別の API リソースを呼び出す必要がある場合は、次のスニペットに示すように、関連するスコープで .AddDownstreamApi() メソッドを繰り返します。

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
    .AddInMemoryTokenCaches();
// ...

.EnableTokenAcquisitionToCallDownstreamApi はパラメーターなしで呼び出されることに注意してください。つまり、コントローラーによってスコープが指定されてトークンが要求されると、ジャストインタイムでアクセス トークンが取得されるという意味です。

スコープは、.EnableTokenAcquisitionToCallDownstreamApi を呼び出すときに渡すこともできます。これにより、Web アプリは最初のユーザー ログイン自体の間にトークンを取得します。 その後、コントローラーが要求すると、トークンがキャッシュからプルされます。

Web アプリと同様に、さまざまなトークン キャッシュ実装を選択できます。 詳細については、GitHub の Microsoft identity web - Token cache serialization (トークン キャッシュのシリアル化) を参照してください。

次の図は、実現可能な Microsoft.Identity.WebProgram.cs への影響を示しています。

Block diagram showing service configuration options in startup dot C S for calling a web API and specifying a token cache implementation

Note

これらのコード例を完全に理解するために、ASP.NET Core の基礎、特に依存関係の挿入オプションについてよく理解してください。

また、Node.js と Azure Functions への OBO フロー実装の例を確認することもできます。

Protocol

OBO プロトコルの詳細については、「Microsoft ID プラットフォームと OAuth 2.0 On-Behalf-Of フロー」を参照してください。

次のステップ

このシナリオの次の記事であるアプリのトークンの取得に関する記事に進みます。