Mengaktifkan autentikasi di API web milik Anda menggunakan Azure AD B2C

Untuk mengotorisasi akses ke API web, Anda hanya dapat melayani permintaan yang menyertakan token akses valid yang menjadi masalah Azure Active Directory B2C (Azure AD B2C). Artikel ini menunjukkan kepada Anda cara mengaktifkan otorisasi Azure AD B2C ke API web Anda. Setelah Anda menyelesaikan langkah-langkah dalam artikel ini, hanya pengguna yang mendapatkan token akses yang valid yang akan diizinkan untuk menghubungi titik akhir API web Anda.

Prasyarat

Sebelum Anda mulai, baca salah satu artikel berikut, yang membahas cara mengonfigurasi autentikasi untuk aplikasi yang memanggil API web. Kemudian, ikuti langkah-langkah dalam artikel ini untuk mengganti contoh API web dengan API web Anda sendiri.

Gambaran Umum

Autentikasi berbasis token memastikan bahwa permintaan ke API web menyertakan token akses yang valid.

Aplikasi menyelesaikan langkah-langkah berikut:

  1. Aplikasi mengautentikasi pengguna dengan Azure AD B2C.

  2. Aplikasi memperoleh token akses dengan izin (cakupan) yang diperlukan untuk titik akhir API web.

  3. Aplikasi meneruskan token akses sebagai token pembawa di header autentikasi permintaan HTTP menggunakan format ini:

    Authorization: Bearer <access token>
    

API web menyelesaikan langkah-langkah berikut:

  1. API web membaca token pembawa dari header otorisasi dalam permintaan HTTP.

  2. API web memvalidasi token.

  3. API web memvalidasi izin (cakupan) dalam token.

  4. API web membaca klaim yang dikodekan dalam token (opsional).

  5. API web menanggapi permintaan HTTP.

Ringkasan pendaftaran aplikasi

Untuk mengaktifkan aplikasi Anda untuk masuk dengan Azure AD B2C dan memanggil API web, Anda perlu mendaftarkan dua aplikasi di direktori Azure AD B2C.

  • Pendaftaran aplikasi web, seluler, atau SPA memungkinkan aplikasi Anda untuk masuk menggunakan Azure AD B2C. Proses pendaftaran aplikasi menghasilkan ID Aplikasi, juga dikenal sebagai ID klien, yang mengidentifikasi aplikasi Anda secara unik (misalnya, ID Aplikasi: 1).

  • Pendaftaran API web memungkinkan aplikasi Anda untuk memanggil API web yang dilindungi. Pendaftaran mengekspos izin API web (cakupan). Proses pendaftaran aplikasi menghasilkan ID Aplikasi, yang secara unik mengidentifikasi API web Anda (misalnya, ID ApIikasi: 2). Berikan izin kepada aplikasi Anda (ID Aplikasi: 1) ke cakupan API web (ID Aplikasi: 2).

Pendaftaran aplikasi dan arsitektur aplikasi dijelaskan dalam diagram berikut:

Diagram of the application registrations and the application architecture for an app with web API.

Mempersiapkan lingkungan pengembangan Anda

Di bagian berikutnya, Anda membuat proyek API web baru. Pilih bahasa pemrograman Anda, ASP.NET Core atau Node.js. Pastikan Anda memiliki komputer yang menjalankan salah satu perangkat lunak berikut:

Langkah 1: Membuat API web yang dilindungi

Buat proyek API web baru. Pertama, pilih bahasa pemrogram yang ingin Anda gunakan, ASP.NET Core atau Node.js.

Gunakan perntah dotnet new. Perintah dotnet new membuat folder baru bernama TodoList dengan aset proyek API web. Buka direktori, lalu buka Visual Studio Code.

dotnet new webapi -o TodoList
cd TodoList
code . 

Ketika Anda diminta untuk "menambahkan aset yang diperlukan ke proyek," pilih Ya.

Langkah 2: Memasang dependensi

Tambahkan pustaka autentikasi ke proyek API web Anda. Pustaka autentikasi mengurai header autentikasi HTTP, memvalidasi token, dan mengekstrak klaim. Untuk informasi lebih lanjut, tinjau dokumentasi untuk pustaka.

Untuk menambahkan pustaka autentikasi, instal paket dengan menjalankan perintah berikut:

dotnet add package Microsoft.Identity.Web

Langkah 3: Memulai pustaka autentikasi

Tambahkan kode yang diperlukan untuk memulai pustaka autentikasi.

Buka Startup.cs, lalu di awal kelas, tambahkan deklarasi using berikut:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

Temukan fungsi ConfigureServices(IServiceCollection services). Kemudian, sebelum baris services.AddControllers(); kode, tambahkan cuplikan kode berikut:

public void ConfigureServices(IServiceCollection services)
{
    // Adds Microsoft Identity platform (Azure AD B2C) support to protect this Api
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(options =>
    {
        Configuration.Bind("AzureAdB2C", options);

        options.TokenValidationParameters.NameClaimType = "name";
    },
    options => { Configuration.Bind("AzureAdB2C", options); });
    // End of the Microsoft Identity platform block    

    services.AddControllers();
}

Temukan fungsi Configure. Kemudian, segera setelah baris app.UseRouting(); kode, tambahkan cuplikan kode berikut:

app.UseAuthentication();

Setelah perubahan, kode Anda akan terlihat seperti cuplikan kode berikut:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();
    
    // Add the following line 
    app.UseAuthentication();
    // End of the block you add
    
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Langkah 4: Menambahkan titik akhir

Tambahkan dua titik akhir ke API web Anda:

  • Titik akhir /public anonim. Titik akhir ini mengembalikan tanggal dan waktu saat ini. Gunakan untuk men-debug API web Anda dengan panggilan anonim.
  • Titik akhir /hello terlindungi. Titik akhir ini mengembalikan nilai klaim name dalam token akses.

Untuk menambahkan titik akhir anonim:

Di bawah folder /Controllers, tambahkan file PublicController.cs, lalu tambahkan ke cuplikan kode berikut:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace TodoList.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class PublicController : ControllerBase
    {
        private readonly ILogger<PublicController> _logger;

        public PublicController(ILogger<PublicController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok( new {date = DateTime.UtcNow.ToString()});
        }
    }
}

Untuk menambahkan titik akhir yang dilindungi:

Di bawah folder /Controllers, tambahkan file HelloController.cs, lalu tambahkan ke kode berikut:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Identity.Web.Resource;

namespace TodoList.Controllers
{
    [Authorize]
    [RequiredScope("tasks.read")]
    [ApiController]
    [Route("[controller]")]
    public class HelloController : ControllerBase
    {

        private readonly ILogger<HelloController> _logger;
        private readonly IHttpContextAccessor _contextAccessor;

        public HelloController(ILogger<HelloController> logger, IHttpContextAccessor contextAccessor)
        {
            _logger = logger;
            _contextAccessor = contextAccessor;
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok( new { name = User.Identity.Name});
        }
    }
}

Pengontrol HelloController controller didekorasi dengan AuthorizeAttribute, yang membatasi akses hanya ke pengguna yang diautentikasi.

Pengontrol juga didekorasi dengan [RequiredScope("tasks.read")]. RequiredScopeAttribute memverifikasi bahwa API web dipanggil dengan cakupan yang benar, tasks.read.

Langkah 5: Mengonfigurasikan server web Anda

Dalam lingkungan pengembangan, atur API web untuk mendengarkan nomor port permintaan HTTP atau HTTPS yang masuk. Dalam contoh ini, gunakan port HTTP 6000 dan port HTTPS 6001. URI dasar API web akan menjadi http://localhost:6000 untuk HTTP dan https://localhost:6001 untuk HTTPS.

Tambahkan cuplikan JSON berikut ke file appsettings.json.

"Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://localhost:6000"
      },
      "Https": {
         "Url": "https://localhost:6001"   
        }
    }
  }

Langkah 6: Mengonfigurasikan API web

Tambahkan konfigurasi ke file konfigurasi. File ini memuat informasi tentang penyedia identitas Azure AD B2C Anda. Aplikasi API web menggunakan informasi ini untuk memvalidasi token akses yang diberikan aplikasi web sebagai token pembawa.

Di bawah folder akar proyek, buka file appsettings.json, lalu tambahkan pengaturan berikut:

{
  "AzureAdB2C": {
    "Instance": "https://contoso.b2clogin.com",
    "Domain": "contoso.onmicrosoft.com",
    "ClientId": "<web-api-app-application-id>",
    "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
    "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
  },
  // More settings here
}

Dalam file appsettings.json, perbarui properti berikut:

Bagian Tombol Nilai
AzureAdB2C Instans Bagian pertama dari nama penyewa Azure AD B2C Anda (misalnya, https://contoso.b2clogin.com).
AzureAdB2C Domain Nama penyewa lengkap penyewa Azure AD B2C Anda (misalnya, contoso.onmicrosoft.com).
AzureAdB2C ClientId ID aplikasi API web. Pada diagram di atas, ini adalah aplikasi dengan ID Aplikasi: 2. Untuk mempelajari cara mendapatkan ID pendaftaran aplikasi API web Anda, lihat Prasyarat.
AzureAdB2C SignUpSignInPolicyId Alur pengguna, atau kebijakan kustom. Untuk mempelajari cara mendapatkan alur atau kebijakan pengguna Anda, lihat Prasyarat.

Langkah 7: Menjalankan dan menguji API web

Akhirnya, jalankan API web dengan pengaturan lingkungan Azure AD B2C Anda.

Di command shell, mulai aplikasi web dengan menjalankan perintah berikut:

 dotnet run

Anda akan melihat output berikut, yang berarti bahwa aplikasi Anda sudah beroperasi dan siap untuk menerima permintaan.

Now listening on: http://localhost:6000

Untuk menghentikan program, di command shell, pilih Ctrl+C. Anda dapat menjalankan kembali aplikasi tersebut dengan menggunakan perintah node app.js.

Tip

Alternatifnya, untuk menjalankan perintah dotnet run, Anda dapat menggunakan debugger Visual Studio Code. Debugger bawaan Visual Studio Code membantu mempercepat loop edit, kompilasi, dan debug Anda.

Buka browser dan kunjungi http://localhost:6000/public. Di jendela browser, Anda akan melihat teks berikut ditampilkan, bersama dengan tanggal dan waktu saat ini.

Langkah 8: Menghubungi API web dari aplikasi Anda

Cobalah untuk memanggil titik akhir API web yang dilindungi tanpa token akses. Buka browser dan kunjungi http://localhost:6000/hello. API akan mengembalikan pesan kesalahan HTTP yang tidak sah, yang mengonfirmasikan bahwa API web dilindungi dengan token pembawa.

Terus konfigurasikan aplikasi Anda untuk memanggil API web. Untuk panduan, lihat bagian Prasyarat.

Tonton video ini untuk mempelajari beberapa praktik terbaik saat Anda mengintegrasikan Azure Active Directory B2C dengan API.

Langkah berikutnya

Dapatkan contoh lengkap di GitHub: