API web yang memanggil API web: Konfigurasi kode
Artikel ini menjelaskan cara mengonfigurasi kode untuk aplikasi API Web menggunakan alur kode otorisasi OAuth 2.0.
Microsoft menyarankan agar Anda menggunakan paket NuGet Microsoft.Identity.Web saat mengembangkan API terlindungi ASP.NET Core yang memanggil API web hilir. Lihat API web terlindungi: Konfigurasi kode | Microsoft.Identity.Web untuk presentasi cepat pustaka tersebut dalam konteks API web.
Prasyarat
Mengonfigurasikan aplikasi
Pilih bahasa untuk API web Anda.
Rahasia klien atau sertifikat klien
Mengingat bahwa aplikasi web Anda sekarang memanggil API web hilir, sediakan sertifikat rahasia klien atau klien dalam file appsettings.json. Anda juga dapat menambahkan bagian yang menentukan:
- URL API web hilir
- Cakupan yang diperlukan untuk memanggil API
Dalam contoh berikut, bagian GraphBeta
menentukan pengaturan ini.
{
"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"]
}
}
Catatan
Anda dapat mengusulkan kumpulan kredensial klien, termasuk solusi tanpa kredensial seperti federasi identitas beban kerja untuk Azure Kubernetes. Versi Microsoft.Identity.Web sebelumnya mengekspresikan rahasia klien dalam satu properti "ClientSecret" alih-alih "ClientCredentials". Ini masih didukung untuk kompatibilitas mundur tetapi Anda tidak dapat menggunakan properti "ClientSecret", dan koleksi "ClientCredentials".
Alih-alih rahasia klien, Anda dapat menyediakan sertifikat klien. Cuplikan kode berikut ini memperlihatkan menggunakan sertifikat yang disimpan di 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"]
}
}
Peringatan
Jika Anda lupa mengubah Scopes
ke array, ketika Anda mencoba menggunakan IDownstreamApi
cakupan akan muncul null, dan IDownstreamApi
akan mencoba panggilan anonim (tidak diautentikasi) ke API hilir, yang akan menghasilkan 401/unauthenticated
.
Microsoft.Identity.Web menyediakan beberapa cara untuk menjelaskan sertifikat, baik berdasarkan konfigurasi maupun kode. Untuk detailnya, lihat Microsoft.Identity.Web - Menggunakan sertifikat di GitHub.
Program.cs
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
// ...
API web perlu memperoleh token untuk API hilir. Tentukan dengan menambahkan .EnableTokenAcquisitionToCallDownstreamApi()
baris setelah .AddMicrosoftIdentityWebApi(Configuration)
. Baris ini mengekspos ITokenAcquisition
layanan yang dapat digunakan dalam tindakan pengontrol/halaman.
Namun, metode alternatif adalah menerapkan cache token. Misalnya, menambahkan .AddInMemoryTokenCaches()
, ke Program.cs memungkinkan token di-cache dalam memori.
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
// ...
Microsoft.Identity.Web menyediakan dua mekanisme untuk memanggil API web hilir dari API lain. Opsi yang Anda pilih tergantung pada apakah Anda ingin memanggil Microsoft Graph atau API lain.
Opsi 1: Memanggil Microsoft Graph
Untuk memanggil Microsoft Graph, Microsoft.Identity.Web memungkinkan Anda untuk langsung menggunakan GraphServiceClient
(diekspos oleh Microsoft Graph SDK) dalam tindakan API.
Catatan
Ada masalah yang sedang berlangsung untuk Microsoft Graph SDK v5+. Untuk informasi selengkapnya, lihat masalah GitHub.
Untuk mengekspose Microsoft Graph:
- Tambahkan paket NuGet Microsoft.Identity.Web.GraphServiceClient ke proyek.
- Tambahkan
.AddMicrosoftGraph()
setelah.EnableTokenAcquisitionToCallDownstreamApi()
di Program.cs..AddMicrosoftGraph()
memiliki beberapa pengambilalihan. Menggunakan ambil alih yang mengambil bagian konfigurasi sebagai parameter, kodenya menjadi:
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
Opsi 2: Memanggil API web hilir selain Microsoft Graph
- Tambahkan paket Microsoft.Identity.Web.DownstreamApi NuGet ke proyek.
- Tambahkan
.AddDownstreamApi()
setelah.EnableTokenAcquisitionToCallDownstreamApi()
di Program.cs. Kode menjadi:
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
.AddInMemoryTokenCaches();
// ...
mana;
MyApi
menunjukkan nama API web hilir yang ingin dipanggil API web AndaMyApiScope
adalah cakupan yang diperlukan agar API web Anda meminta untuk berinteraksi dengan API web hilir
Nilai-nilai ini akan diwakili dalam JSON Anda yang akan mirip dengan cuplikan berikut.
"DownstreamAPI": {
"BaseUrl": "https://downstreamapi.contoso.com/",
"Scopes": "user.read"
},
Jika aplikasi web perlu memanggil sumber daya API lain, ulangi .AddDownstreamApi()
metode dengan cakupan yang relevan seperti yang ditunjukkan dalam cuplikan berikut:
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
.AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
.AddInMemoryTokenCaches();
// ...
Perhatikan bahwa .EnableTokenAcquisitionToCallDownstreamApi
dipanggil tanpa parameter apa pun, yang berarti bahwa token akses diperoleh tepat pada waktunya karena pengontrol meminta token dengan menentukan cakupan.
Cakupan juga dapat diteruskan saat memanggil .EnableTokenAcquisitionToCallDownstreamApi
, yang akan membuat aplikasi web memperoleh token selama login pengguna awal itu sendiri. Token kemudian akan ditarik dari cache ketika pengontrol memintanya.
Mirip dengan aplikasi web, berbagai implementasi cache token dapat dipilih. Untuk detailnya, lihat Web identitas Microsoft - Serialisasi cache token di GitHub.
Gambar berikut menunjukkan kemungkinan Microsoft.Identity.Web dan dampaknya pada Program.cs:
Catatan
Untuk sepenuhnya memahami contoh kode di sini, kuasai dasar-dasar ASP.NET Core, dan khususnya dengan injeksi dependensi dan opsi.
Anda juga dapat melihat contoh penerapan alur OBO di Node.js dan Azure Functions.
Protokol
Untuk informasi selengkapnya tentang protokol OBO, lihat platform identitas Microsoft dan alur On-Behalf-Of OAuth 2.0.