Bagikan melalui


Mengaktifkan opsi autentikasi di aplikasi web dengan menggunakan Azure AD B2C

Penting

Berlaku mulai 1 Mei 2025, Azure AD B2C tidak akan lagi tersedia untuk dibeli untuk pelanggan baru. Pelajari lebih lanjut di FAQ kami.

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

Sebelum memulai, penting untuk membiasakan diri dengan artikel berikut:

Menggunakan domain kustom

Dengan menggunakan domain kustom, Anda dapat sepenuhnya memberi merek URL autentikasi. Dari perspektif pengguna, pengguna tetap berada di domain Anda selama proses autentikasi, daripada dialihkan ke nama domain azure AD B2C b2clogin.com.

Untuk menghapus semua referensi ke "b2c" di URL, Anda juga dapat mengganti nama penyewa B2C, contoso.onmicrosoft.com, di URL permintaan autentikasi dengan GUID ID penyewa Anda. Misalnya, Anda dapat mengubah https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ ke 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 berisi informasi tentang IdP Azure AD B2C Anda.

Dalam file appsettings.json , lakukan hal berikut:

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 menyesuaikan permintaan autentikasi yang dikirim aplikasi Anda ke Azure AD B2C.

Untuk mendukung skenario tingkat lanjut, buka file Startup.cs dan, dalam ConfigureServices fungsi, ganti dengan cuplikan AddMicrosoftIdentityWebAppAuthentication 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 peristiwa OnRedirectToIdentityProvider dengan referensi ke OnRedirectToIdentityProviderFunc metode . Tambahkan cuplikan kode berikut ke Startup.cs kelas .

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 OnRedirectToIdentityProvider fungsi dengan menggunakan parameter konteks.

Mengisi nama masuk terlebih dahulu

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

Untuk mengisi nama masuk terlebih dahulu, lakukan hal berikut:

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

  2. Selesaikan prosedur Dukung skenario lanjutan .

  3. Tambahkan baris kode berikut ke OnRedirectToIdentityProvider fungsi :

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

Memilih penyedia identitas terlebih dahulu

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

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

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

  2. Selesaikan prosedur Dukung skenario lanjutan .

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

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

Tentukan bahasa UI

Penyesuaian bahasa di 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 kustomisasi bahasa.

  2. Selesaikan prosedur Dukung skenario lanjutan .

  3. Tambahkan baris kode berikut ke OnRedirectToIdentityProvider fungsi :

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

Mengirimkan parameter string kueri kustom

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

Untuk meneruskan parameter string kueri kustom, lakukan hal berikut:

  1. Konfigurasikan elemen ContentDefinitionParameters .

  2. Selesaikan prosedur Dukung skenario lanjutan .

  3. Tambahkan baris kode berikut ke OnRedirectToIdentityProvider fungsi :

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

Berikan 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 menyertakan petunjuk token ID dalam permintaan autentikasi, lakukan hal berikut:

  1. Selesaikan prosedur Dukung skenario lanjutan .

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

  3. Tambahkan baris kode berikut ke OnRedirectToIdentityProvider fungsi :

    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 , kami mendorong Anda untuk membuat pengontrol Anda sendiri. Memiliki pengontrol Anda sendiri memungkinkan Anda meneruskan parameter antara pengontrol dan pustaka autentikasi. AccountController adalah bagian Microsoft.Identity.Web.UI dari paket NuGet, yang menangani tindakan masuk dan keluar. Anda dapat menemukan implementasinya di pustaka Web Identitas Microsoft.

Menambahkan pengontrol Akun

Di proyek Visual Studio Anda, klik kanan folder Pengontrol , lalu tambahkan Pengontrol baru. Pilih MVC - Pengontrol Kosong, lalu berikan nama MyAccountController.cs.

Cuplikan kode berikut menunjukkan kustom MyAccountController dengan 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);
        }

    }
}

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

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

Meneruskan ID kebijakan Azure AD B2C

Cuplikan kode berikut menunjukkan kustom MyAccountController dengan tindakan SignIn dan SignUp . Tindakan meneruskan parameter bernama policy ke pustaka autentikasi. Ini memungkinkan Anda memberikan ID kebijakan Azure AD B2C yang benar 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);
}

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

Meneruskan parameter kustom

Cuplikan kode berikut menunjukkan kustom MyAccountController dengan tindakan SignIn . Tindakan 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 Dukung skenario lanjutan lalu, dalam OnRedirectToIdentityProvider metode , baca parameter kustom:

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);
}

Amankan pengalihan logout Anda

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

Untuk mendukung pengalihan keluar yang aman di aplikasi Anda, pertama-tama ikuti langkah-langkah di bagian Pengontrol akun dan Dukungan skenario tingkat lanjut . Kemudian ikuti langkah-langkah di bawah ini:

  1. Di MyAccountController.cs pengontrol, 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. Di kelas Startup.cs , uraikan id_token_hint nilai dan tambahkan nilai ke permintaan autentikasi. Cuplikan kode berikut menunjukkan cara meneruskan id_token_hint nilai 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. ConfigureServices Dalam fungsi , tambahkan SaveTokens opsi untuk Pengontrol memiliki akses ke id_token nilai :

    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 SignedOutCallbackPath kunci.

    "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 permintaan keluar akan dalam 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 berwenang untuk mengakses sumber daya yang dilindungi dengan menggunakan salah satu metode berikut:

Dalam metode , ConfigureServices tambahkan AddAuthorization metode , yang menambahkan model otorisasi. Contoh berikut membuat kebijakan bernama EmployeeOnly. Kebijakan memeriksa untuk memverifikasi bahwa klaim EmployeeNumber ada. Nilai klaim harus salah satu 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 otorisasi di ASP.NET Core dengan menggunakan AuthorizeAttribute dan berbagai parameternya. Dalam bentuk yang paling dasar, menerapkan Authorize atribut ke pengontrol, tindakan, atau Halaman Razor membatasi akses ke pengguna terautentikasi komponen tersebut.

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

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

Langkah selanjutnya