呼叫 Web API 的 Web API:程式碼設定
本文說明如何使用 OAuth 2.0 授權碼流程來設定 Web API 應用程式的程式代碼。
Microsoft 建議您在開發 ASP.NET Core 受保護的 API 來呼叫下游 Web API 時,使用 Microsoft.Identity.Web NuGet 套件。 請參閱 受保護的 Web API:程式碼設定 | Microsoft.Identity.Web 在 Web API 的內容中快速呈現該程式庫的資訊。
必要條件
設定應用程式
選擇 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"]
}
}
注意
您可以提出一組用戶端認證,包括無認證解決方案,例如 Azure Kubernetes 的工作負載身分識別同盟。 舊版的 Microsoft.Identity.Web 在單一屬性 "ClientSecret" 中表示用戶端密碼,而不是 "ClientCredentials"。 這仍支援回溯相容性,但您無法同時使用 "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。 您選擇的選項取決於您是否要呼叫 Microsoft Graph 或其他 API。
選項 1:呼叫 Microsoft Graph
若要呼叫 Microsoft Graph,Microsoft.Identity.Web 會讓您在 API 動作中直接使用 GraphServiceClient
(由 Microsoft Graph SDK 公開)。
注意
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 - 權杖快取序列化。
下圖顯示 Microsoft.Identity.Web 的可能性,以及對 Program.cs 的影響:
注意
若要完全了解此處的程式碼範例,請熟悉 ASP.NET Core 基本概念,特別是相依性插入和選項。
您也可以在 Node.js 和 Azure Functions 中看到 OBO 流程執行的範例。
通訊協定
如需 OBO 通訊協定的詳細資訊,請參閱 Microsoft 身分識別平台和 OAuth 2.0 代理者流程。
後續步驟
取得應用程式的令牌。