Bagikan melalui


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:

  1. Tambahkan paket NuGet Microsoft.Identity.Web.GraphServiceClient ke proyek.
  2. 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

  1. Tambahkan paket Microsoft.Identity.Web.DownstreamApi NuGet ke proyek.
  2. 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 Anda
  • MyApiScope 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:

Diagram blok memperlihatkan opsi konfigurasi layanan di titik startup C S untuk memanggil API web, dan menentukan penerapan cache token

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.

Langkah selanjutnya