Aplikasi web yang memanggil API web: Konfigurasi kode

Seperti yang ditunjukkan dalam skenario Aplikasi web yang memasukkan pengguna, aplikasi web menggunakan alur kode otorisasi OAuth 2.0 untuk memasukkan pengguna. Alur ini memiliki dua langkah:

  1. Meminta kode otorisasi. Bagian ini mendelegasikan dialog pribadi dengan pengguna ke platform identitas Microsoft. Selama dialog tersebut, pengguna masuk dan menyetujui penggunaan API web. Ketika dialog pribadi berakhir dengan sukse, aplikasi web menerima kode otorisasi pada URI pengalihannya.
  2. Menukarkan token akses untuk API dengan menukarkan kode otorisasi.

Skenario Aplikasi web yang memasukkan pengguna hanya mencakup langkah pertama. Di sini Anda mempelajari cara memodifikasi aplikasi web sehingga tidak hanya memasukkan pengguna tetapi juga sekarang memanggil API web.

Pustaka Microsoft yang mendukung aplikasi web

Pustaka Microsoft berikut ini mendukung aplikasi web:

Bahasa pemrogram/kerangka kerja Proyek di
GitHub
Paket Persiapan
memulai
Memasukkan pengguna Mengakses API web Tersedia secara umum (GA) atau
Pratinjau umum1
.NET MSAL.NET Microsoft.Identity.Client Pustaka tidak dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. GA
.NET Microsoft.IdentityModel Microsoft.IdentityModel Pustaka tidak dapat meminta token ID untuk login pengguna.2 Pustaka tidak dapat meminta token akses untuk API web yang dilindungi.2 GA
Inti ASP.NET Inti ASP.NET Microsoft.AspNetCore.Authentication Mulai Cepat Pustaka dapat meminta token ID untuk login pengguna. Pustaka tidak dapat meminta token akses untuk API web yang dilindungi. GA
Inti ASP.NET Microsoft.Identity.Web Microsoft.Identity.Web Mulai Cepat Pustaka dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. GA
Java MSAL4J msal4j Mulai Cepat Pustaka dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. GA
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Tutorial Pustaka dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. GA
Node.js MSAL Node msal-node Mulai Cepat Pustaka dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. GA
Python MSAL Python msal Pustaka dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. GA
Python identitas identitas Mulai Cepat Pustaka dapat meminta token ID untuk login pengguna. Pustaka dapat meminta token akses untuk API web yang dilindungi. --

(1)Ketentuan Lisensi Universal untuk Layanan Online berlaku untuk pustaka di Pratinjau publik.

(2) Pustaka Microsoft.IdentityModel hanya memvalidasi token - pustaka tidak dapat meminta ID atau token akses.

Pilih tab untuk platform yang Anda minati:

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.

Startup.cs

Aplikasi web Anda perlu memperoleh token untuk API hilir. Anda menentukannya dengan menambahkan baris .EnableTokenAcquisitionToCallDownstreamApi() setelah .AddMicrosoftIdentityWebApp(Configuration). Baris ini mengekspose layanan IAuthorizationHeaderProvider yang dapat Anda gunakan dalam pengontrol dan tindakan halaman Anda. Namun, seperti yang Anda lihat dalam dua opsi berikut, itu dapat dilakukan lebih sederhana. Anda juga perlu memilih implementasi cache token, misalnya .AddInMemoryTokenCaches(), dalam Startup.cs:

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

Cakupan yang diteruskan bersifat EnableTokenAcquisitionToCallDownstreamApi opsional, dan memungkinkan aplikasi web Anda untuk meminta cakupan dan persetujuan pengguna untuk cakupan tersebut saat mereka masuk. Jika Anda tidak menentukan cakupan, Microsoft.Identity.Web memungkinkan pengalaman persetujuan inkremental.

Microsoft.Identity.Web menawarkan dua mekanisme untuk memanggil API web dari aplikasi web tanpa Anda harus memperoleh token. Opsi yang Anda pilih tergantung pada apakah Anda ingin memanggil Microsoft Graph atau API lain.

Opsi 1: Memanggil Microsoft Graph

Jika Anda ingin memanggil Microsoft Graph, Microsoft.Identity.Web memungkinkan Anda untuk langsung menggunakan GraphServiceClient (diekspos oleh Microsoft Graph SDK) dalam API tindakan Anda. Untuk mengekspose Microsoft Graph:

  1. Tambahkan paket NuGet Microsoft.Identity.Web.GraphServiceClient ke proyek Anda.

  2. Tambahkan .AddMicrosoftGraph() setelah .EnableTokenAcquisitionToCallDownstreamApi() dalam Startup.cs. .AddMicrosoftGraph() memiliki beberapa pengambilalihan. Menggunakan ambil alih yang mengambil bagian konfigurasi sebagai parameter, kodenya menjadi:

    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Opsi 2: Memanggil API web hilir selain Microsoft Graph

Jika Anda ingin memanggil API selain Microsoft Graph, Microsoft.Identity.Web memungkinkan Anda menggunakan IDownstreamApi antarmuka dalam tindakan API Anda. Untuk menggunakan antarmuka ini:

  1. Tambahkan paket Microsoft.Identity.Web.DownstreamApi NuGet ke proyek Anda.

  2. Tambahkan .AddDownstreamApi() setelah .EnableTokenAcquisitionToCallDownstreamApi() dalam Startup.cs. .AddDownstreamApi() memiliki dua argumen, dan diperlihatkan dalam cuplikan berikut:

    • Nama layanan (API), yang digunakan dalam tindakan pengontrol Anda untuk mereferensikan konfigurasi yang sesuai
    • bagian konfigurasi yang mewakili parameter yang digunakan untuk memanggil API web hilir.
    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Ringkasan

Seperti halnya API web, Anda dapat memilih beragam penerapan cache token. Untuk detailnya, lihat Microsoft.Identity.Web - Serialisasi cache token di GitHub.

Gambar berikut menunjukkan berbagai kemungkinan Microsoft.Identity.Web dan efeknya pada file Startup.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.

Kode yang menukarkan kode otorisasi

Microsoft.Identity.Web menyederhanakan kode Anda dengan mengatur pengaturan OpenID Connect yang benar, berlangganan kode kejadian yang diterima, dan menukarkan kode. Tidak ada kode tambahan yang diperlukan untuk menukarkan kode otorisasi. Lihat Kode sumber Microsoft.Identity.Web detail tentang cara kerjanya.

Alih-alih rahasia klien, aplikasi klien rahasia juga dapat membuktikan identitasnya dengan menggunakan sertifikat klien atau pernyataan klien. Penggunaan pernyataan klien adalah skenario lanjutan, yang dirinci dalam Penegasan klien.

Cache token

Penting

Penerapan cache token untuk aplikasi web atau API web berbeda dengan penerapan untuk aplikasi desktop, yang seringkali berbasis file. Demi alasan keamanan dan performa, penting untuk memastikan bahwa untuk aplikasi web dan API web terdapat satu cache token per akun pengguna. Anda harus melakukan serialisasi cache token untuk setiap akun.

Tutorial inti ASP.NET menggunakan injeksi dependensi agar Anda dapat memutuskan penerapan cache token di file Startup.cs untuk aplikasi Anda. Microsoft.Identity.Web dilengkapi dengan serializer token-cache bawaan yang dijelaskan dalam serialisasi cache Token. Kemungkinan yang menarik adalah memilih cache memori terdistribusi ASP.NET Core:

// Use a distributed token cache by adding:
    services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(
                initialScopes: new string[] { "user.read" })
            .AddDistributedTokenCaches();

// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();

// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
 options.Configuration = "localhost";
 options.InstanceName = "SampleInstance";
});

// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
 options.ConnectionString = _config["DistCache_ConnectionString"];
 options.SchemaName = "dbo";
 options.TableName = "TestCache";
});

Untuk detail tentang penyedia token-cache, lihat juga artikel serialisasi cache Token Microsoft.Identity.Web, dan tutorial aplikasi web ASP.NET Core | Fase cache token tutorial aplikasi web.

Langkah berikutnya

Pada titik ini, ketika pengguna masuk, token akan disimpan di cache token. Mari kita lihat bagaimana kemudian token digunakan di bagian lain dari aplikasi web.

Lanjutkan ke artikel berikutnya dalam skenario ini, Hapus akun dari cache saat keluar global.