Web API を呼び出す Web API:コード構成
この記事では、OAuth 2.0 認証コード フローを使用して Web API アプリのコードを構成する方法について説明します。
ダウンストリーム Web API を呼び出す ASP.NET Core で保護された API を開発する場合は、Microsoft.Identity.Web NuGet パッケージを使用することをお勧めします。 「保護された Web API: Web API のコンテキストでそのライブラリをすばやく表示するには、コード構成の「Microsoft.Identity.Web」を参照してください。
前提条件
Configure the app
Web API の言語を選択します。
クライアント シークレットまたはクライアント証明書
ご利用の 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 を公開するには、次の手順を実行します。
- Microsoft.Identity.Web.GraphServiceClient NuGet パッケージをプロジェクトに追加します。
- 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 を呼び出す
- Microsoft.Identity.Web.DownstreamApi NuGet パッケージをプロジェクトに追加します。
- 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.Web と Program.cs への影響を示しています。
注意
これらのコード例を完全に理解するために、ASP.NET Core の基礎、特に依存関係の挿入とオプションについてよく理解してください。
また、Node.js と Azure Functions への OBO フロー実装の例を確認することもできます。
Protocol
OBO プロトコルの詳細については、「Microsoft ID プラットフォームと OAuth 2.0 On-Behalf-Of フロー」を参照してください。