Bagikan melalui


Aktifkan opsi otentikasi di aplikasi web dengan menggunakan Azure AD B2C

Artikel ini menjelaskan cara mengaktifkan, mengkustomisasi, dan meningkatkan pengalaman otentikasi Azure Active Directory B2C (Azure AD B2C) untuk aplikasi web Anda.

Sebelum Anda mulai, penting untuk membiasakan diri dengan artikel berikut:

Menggunakan domain kustom

Dengan menggunakan domain kustom, Anda dapat sepenuhnya menandai URL autentikasi. Dari perspektif pengguna, pengguna tetap berada di domain Anda selama proses autentikasi, bukan dialihkan ke nama domain b2clogin.com Azure Active Directory B2C.

Untuk menghapus semua referensi “b2c” pada URL, Anda dapat mengganti nama penyewa B2C Anda, contoso.onmicrosoft.com, pada URL permintaan autentikasi dengan pengidentifikasi unik ID penyewa Anda. Misalnya, Anda dapat mengubah https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ menjadi https://account.contosobank.co.uk/<tenant ID GUID>/.

Untuk menggunakan domain kustom dan ID penyewa Anda di URL autentikasi, ikuti panduan di Mengaktifkan domain kustom. Di bawah folder akar proyek, buka file appsettings.json. File ini memuat informasi tentang penyedia identitas Azure AD B2C Anda.

Dalam file appsettings.json, lakukan hal berikut:

  • Perbarui entri Instance dengan domain kustom Anda.
  • Perbarui entri Domain dengan domain dengan ID penyewa Anda. Untuk informasi selengkapnya, lihat Gunakan ID penyewa.

JSON berikut menunjukkan pengaturan aplikasi sebelum perubahan:

"AzureAdB2C": {
  "Instance": "https://contoso.b2clogin.com",
  "Domain": "tenant-name.onmicrosoft.com",
  ...
}

JSON berikut menunjukkan pengaturan aplikasi setelah perubahan:

"AzureAdB2C": {
  "Instance": "https://login.contoso.com",
  "Domain": "00000000-0000-0000-0000-000000000000",
  ...
}

Mendukung skenario tingkat lanjut

Metode AddMicrosoftIdentityWebAppAuthentication dalam API platform identitas Microsoft memungkinkan pengembang menambahkan kode untuk skenario autentikasi tingkat lanjut atau berlangganan peristiwa OpenIdConnect. Misalnya, Anda dapat berlangganan OnRedirectToIdentityProvider, yang memungkinkan Anda untuk menyesuaikan permintaan autentikasi yang dikirim aplikasi Anda ke Azure AD B2C.

Untuk mendukung skenario lanjutan, buka file Startup.cs dan, dalam fungsi ConfigureServices, ganti AddMicrosoftIdentityWebAppAuthentication dengan cuplikan kode berikut:

// Configuration to sign-in users with Azure AD B2C

//services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C");

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
{
    Configuration.Bind("AzureAdB2C", options);
    options.Events ??= new OpenIdConnectEvents();
    options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
});

Kode sebelumnya menambahkan acara OnRedirectToIdentityProvider dengan referensi ke metode OnRedirectToIdentityProviderFunc. Tambahkan cuplikan kode berikut ke kelas Startup.cs.

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Custom code here
    
    // Don't remove this line
    await Task.CompletedTask.ConfigureAwait(false);
}

Anda dapat meneruskan parameter antara pengontrol dan fungsi OnRedirectToIdentityProvider dengan menggunakan parameter konteks.

Prepopulasi nama rincian masuk

Selama perjalanan pengguna masuk, aplikasi Anda mungkin menargetkan pengguna tertentu. Saat aplikasi menargetkan pengguna, aplikasi dapat menentukan permintaan otorisasi login_hint parameter kueri dengan nama rincian masuk pengguna. Azure Active Directory B2C secara otomatis mengisi nama rincian masuk, dan pengguna hanya perlu memberikan kata sandi.

Untuk mengisi nama rincian masuk terlebih dahulu, lakukan hal berikut:

  1. Jika Anda menggunakan kebijakan kustom, tambahkan klaim input yang diperlukan seperti yang dijelaskan dalam Menyiapkan masuk langsung.

  2. Selesaikan prosedur Dukung skenario tingkat lanjut.

  3. Tambahkan baris kode berikut ke fungsi OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.LoginHint = "emily@contoso.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Memilih sebelumnya penyedia identitas

Jika Anda mengonfigurasi perjalanan rincian masuk untuk aplikasi Anda untuk menyertakan akun sosial, seperti Facebook, LinkedIn, atau Google, Anda dapat menentukan parameter domain_hint. Parameter kueri ini memberikan petunjuk untuk Azure AD B2C tentang IdP sosial yang harus digunakan untuk rincian masuk. Misalnya, jika aplikasi menentukan domain_hint=facebook.com, alur masuk langsung menuju ke halaman masuk Facebook.

Untuk mengalihkan pengguna ke penyedia identitas eksternal, lakukan tindakan berikut:

  1. Periksa nama domain penyedia identitas eksternal Anda. Untuk informasi selengkapnya, lihat Mengalihkan rincian masuk ke penyedia sosial.

  2. Selesaikan prosedur Dukung skenario tingkat lanjut.

  3. Dalam fungsi OnRedirectToIdentityProviderFunc, tambahkan baris kode berikut ke fungsi OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.DomainHint = "facebook.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Tentukan bahasa UI

Kustomisasi bahasa pemrogram di Microsoft Azure AD B2C memungkinkan alur pengguna Anda untuk mengakomodasi berbagai bahasa yang sesuai dengan kebutuhan pelanggan Anda. Untuk informasi selengkapnya, lihat Kustomisasi bahasa.

Untuk mengatur bahasa pilihan, lakukan hal berikut:

  1. Mengonfigurasi penyesuaian bahasa.

  2. Selesaikan prosedur Dukung skenario tingkat lanjut.

  3. Tambahkan baris kode berikut ke fungsi OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.UiLocales = "es";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Meneruskan parameter string kueri kustom

Dengan kebijakan kustom, Anda dapat meneruskan parameter string kueri kustom. Contoh kasus penggunaan yang tepat adalah saat Anda ingin mengubah konten halaman secara dinamis.

Untuk meneruskan parameter string kueri kustom, lakukan tindakan berikut:

  1. Mengonfigurasi elemen ContentDefinitionParameters.

  2. Selesaikan prosedur Dukung skenario tingkat lanjut.

  3. Tambahkan baris kode berikut ke fungsi OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.Parameters.Add("campaignId", "123");
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Meneruskan petunjuk token ID

Aplikasi pihak yang mengandalkan dapat mengirim JSON Web Token (JWT) masuk sebagai bagian dari permintaan otorisasi OAuth2. Token masuk adalah petunjuk tentang pengguna atau permintaan otorisasi. Azure AD B2C memvalidasi token, lalu mengekstrak klaim.

Untuk memasukkan petunjuk token ID dalam permintaan autentikasi, lakukan tindakan berikut:

  1. Selesaikan prosedur Dukung skenario tingkat lanjut.

  2. Dalam kebijakan kustom Anda, tetapkan profil teknis petunjuk token ID.

  3. Tambahkan baris kode berikut ke fungsi OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      // The idTokenHint variable holds your ID token 
      context.ProtocolMessage.IdTokenHint = idTokenHint
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Pengontrol akun

Jika Anda ingin menyesuaikan tindakan SignIn, SignUp, atau SignOut, sebaiknya buat pengontrol Anda sendiri. Memiliki pengontrol sendiri memungkinkan Anda untuk melewati parameter antara pengontrol dan perpustakaan autentikasi. AccountController adalah bagian dari Microsoft.Identity.Web.UI paket NuGet, yang menangani tindakan masuk dan keluar. Anda dapat menemukan implementasinya di pustaka Microsoft Identity Web.

Tambahkan Pengontrol akun

Dalam proyek Visual Studio Anda, klik kanan folder Controllers, lalu tambahkan Controller baru. Pilih MVC - Empty Controller, lalu berikan nama MyAccountController.cs.

Cuplikan kode berikut menunjukkan kustom dengan MyAccountController tindakan SignIn.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;


namespace mywebapp.Controllers
{
    [AllowAnonymous]
    [Area("MicrosoftIdentity")]
    [Route("[area]/[controller]/[action]")]
    public class MyAccountController : Controller
    {

        [HttpGet("{scheme?}")]
        public IActionResult SignIn([FromRoute] string scheme)
        {
            scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
            var redirectUrl = Url.Content("~/");
            var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
            return Challenge(properties, scheme);
        }

    }
}

Pada tampilan _LoginPartial.cshtml, ubah tautan masuk ke pengontrol Anda.

<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">

Teruskan ID kebijakan AAD B2C

Cuplikan kode berikut menunjukkan MyAccountController kustom dengan tindakan SignIn dan SignUp. Tindakan ini meneruskan parameter bernama policy ke pustaka autentikasi. Hal ini memungkinkan Anda untuk memberikan ID kebijakan Azure AD B2C yang sesuai untuk tindakan tertentu.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    return Challenge(properties, scheme);
}

public IActionResult SignUp([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignUp";
    return Challenge(properties, scheme);
}

Pada tampilan _LoginPartial.cshtml, ubah nilai asp-controller menjadi MyAccountController untuk tautan autentikasi lainnya, seperti pendaftaran atau edit profil.

Teruskan parameter kustom

Cuplikan kode berikut menunjukkan kustom dengan MyAccountController tindakan SignIn. Tindakan ini meneruskan parameter bernama campaign_id ke pustaka autentikasi.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    properties.Items["campaign_id"] = "1234";
    return Challenge(properties, scheme);
}

Selesaikan prosedur Dukungan skenario lanjutan lalu, dalam metode OnRedirectToIdentityProvider, baca parameter khusus:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Read the custom parameter
    var campaign_id = context.Properties.Items.FirstOrDefault(x => x.Key == "campaign_id").Value;

    // Add your custom code here
    if (campaign_id != null)
    {
        // Send parameter to authentication request
        context.ProtocolMessage.SetParameter("campaign_id", campaign_id);
    }
    
    await Task.CompletedTask.ConfigureAwait(false);
}

Mengamankan pengalihan keluar Anda

Setelah keluar, pengguna dialihkan ke URI yang ditentukan dalam parameter post_logout_redirect_uri, terlepas dari URL balasan yang telah ditentukan untuk aplikasi. Namun, jika valid id_token_hint dilewatkan, dan Memerlukan Token Id dalam permintaan keluar diaktifkan, Azure AD B2C memverifikasi bahwa nilai post_logout_redirect_uri sesuai dengan salah satu URI pengalihan yang dikonfigurasi aplikasi sebelum melakukan pengalihan. Jika tidak ada URL balasan yang cocok yang dikonfigurasi untuk aplikasi, pesan kesalahan akan ditampilkan dan pengguna tidak dialihkan.

Untuk mendukung pengalihan keluar aman di aplikasi Anda, pertama ikuti langkah-langkah dalam bagian Pengontrol akun and Skenario tingkat lanjut dukungan. Lalu ikuti langkah-langkah berikut:

  1. Dalam pengontrol MyAccountController.cs, tambahkan tindakan SignOut menggunakan cuplikan kode berikut:

    [HttpGet("{scheme?}")]
    public async Task<IActionResult> SignOutAsync([FromRoute] string scheme)
    {
        scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    
        //obtain the id_token
        var idToken = await HttpContext.GetTokenAsync("id_token");
        //send the id_token value to the authentication middleware
        properties.Items["id_token_hint"] = idToken;            
    
        return SignOut(properties,CookieAuthenticationDefaults.AuthenticationScheme,scheme);
    }
    
  2. Dalam kelas Startup.cs, urai nilai id_token_hint dan gabungkan nilai ke permintaan autentikasi. Cuplikan kode berikut menunjukkan cara meneruskan nilai id_token_hint ke permintaan autentikasi:

    private async Task OnRedirectToIdentityProviderForSignOutFunc(RedirectContext context)
    {
        var id_token_hint = context.Properties.Items.FirstOrDefault(x => x.Key == "id_token_hint").Value;
        if (id_token_hint != null)
        {
            // Send parameter to authentication request
            context.ProtocolMessage.SetParameter("id_token_hint", id_token_hint);
        }
    
        await Task.CompletedTask.ConfigureAwait(false);
    }
    
  3. Dalam fungsi ConfigureServices, tambahkan opsi SaveTokens untuk Pengontrol memiliki akses ke nilai id_token:

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. Dalam file konfigurasi appsettings.json, tambahkan jalur URI pengalihan keluar Anda ke kunci SignedOutCallbackPath.

    "AzureAdB2C": {
      "Instance": "https://<your-tenant-name>.b2clogin.com",
      "ClientId": "<web-app-application-id>",
      "Domain": "<your-b2c-domain>",
      "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
      "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
    }
    

Dalam contoh di atas, post_logout_redirect_uri yang diteruskan ke dalam permintaan keluar akan berupa format: https://your-app.com/signout/<your-sign-up-in-policy>. URL ini harus ditambahkan ke URL balasan Pendaftaran Aplikasi.

Kontrol akses berbasis peran

Dengan otorisasi di ASP.NET Core Anda dapat memeriksa apakah pengguna diizinkan untuk mengakses sumber daya yang dilindungi dengan menggunakan salah satu metode berikut:

Dalam metode ConfigureServices, tambahkan metode AddAuthorization, yang menambahkan model otorisasi. Contoh berikut membuat kebijakan dengan nama EmployeeOnly. Kebijakan memeriksa untuk memverifikasi bahwa klaim EmployeeNumber ada. Nilai klaim harus salah satu dari ID berikut: 1, 2, 3, 4, atau 5.

services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy =>
              policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });

Anda mengontrol autorisasi ASP.NET Core dengan menggunakan AuthorizeAttribute dan berbagai parameternya. Dalam bentuknya yang paling mendasar, menerapkan atribut Authorize ke pengontrol, tindakan, atau Halaman Razor membatasi akses ke pengguna terautentikasi komponen tersebut.

Anda menerapkan kebijakan pada pengontrol dengan menggunakan atribut Authorize dengan nama kebijakan. Kode berikut membatasi akses ke tindakan Claims kepada pengguna yang diizinkan oleh kebijakan EmployeeOnly:

[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
    return View();
}

Langkah berikutnya