Bagikan melalui


Mengautentikasi Pengguna dengan Azure Active Directory B2C

Azure Active Directory B2C menyediakan manajemen identitas cloud untuk aplikasi web dan seluler yang menghadap konsumen. Artikel ini memperlihatkan cara menggunakan Azure Active Directory B2C untuk mengintegrasikan manajemen identitas ke dalam aplikasi seluler dengan Pustaka Autentikasi Microsoft.

Gambaran Umum

Azure Active Directory B2C (ADB2C) adalah layanan manajemen identitas untuk aplikasi yang menghadap konsumen. Ini memungkinkan pengguna untuk masuk ke aplikasi Anda menggunakan akun sosial atau kredensial kustom yang ada seperti email atau nama pengguna, dan kata sandi. Akun kredensial kustom disebut sebagai akun lokal .

Proses untuk mengintegrasikan layanan manajemen identitas Azure Active Directory B2C ke dalam aplikasi seluler adalah sebagai berikut:

  1. Membuat penyewa Azure Active Directory B2C.
  2. Daftarkan aplikasi seluler Anda dengan penyewa Azure Active Directory B2C.
  3. Buat kebijakan untuk pendaftaran dan masuk, dan lupa alur pengguna kata sandi.
  4. Gunakan Microsoft Authentication Library (MSAL) untuk memulai alur kerja autentikasi dengan penyewa Azure Active Directory B2C Anda.

Catatan

Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.

Azure Active Directory B2C mendukung beberapa penyedia identitas termasuk Microsoft, GitHub, Facebook, Twitter, dan banyak lagi. Untuk informasi selengkapnya tentang kemampuan Azure Active Directory B2C, lihat Dokumentasi Azure Active Directory B2C.

Microsoft Authentication Library mendukung beberapa arsitektur dan platform aplikasi. Untuk informasi tentang kemampuan MSAL, lihat Pustaka Autentikasi Microsoft di GitHub.

Mengonfigurasi penyewa Azure Active Directory B2C

Untuk menjalankan proyek sampel, Anda harus membuat penyewa Azure Active Directory B2C. Untuk informasi selengkapnya, lihat Membuat penyewa Azure Active Directory B2C di portal Azure.

Setelah membuat penyewa, Anda akan memerlukan nama penyewa dan ID penyewa untuk mengonfigurasi aplikasi seluler. ID penyewa dan nama ditentukan oleh domain yang dihasilkan saat Anda membuat URL penyewa. Jika URL penyewa yang Anda buat adalah https://contoso20190410tenant.onmicrosoft.com/ ID penyewa adalah contoso20190410tenant.onmicrosoft.com dan nama penyewanya adalah contoso20190410tenant. Temukan domain penyewa di portal Azure dengan mengklik direktori dan filter langganan di menu atas. Cuplikan layar berikut menunjukkan tombol filter direktori dan langganan Azure dan domain penyewa:

Nama penyewa dalam tampilan filter direktori dan langganan Azure

Dalam proyek sampel, edit file Constants.cs untuk mengatur tenantName bidang dan tenantId . Kode berikut menunjukkan bagaimana nilai-nilai ini harus diatur jika domain penyewa Anda adalah https://contoso20190410tenant.onmicrosoft.com/, ganti nilai-nilai ini dengan nilai dari portal Anda:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    ...
}

Mendaftarkan aplikasi seluler Anda dengan Azure Active Directory B2C

Aplikasi seluler harus terdaftar di penyewa sebelum dapat menyambungkan dan mengautentikasi pengguna. Proses pendaftaran menetapkan ID Aplikasi unik ke aplikasi, dan URL Pengalihan yang mengarahkan respons kembali ke aplikasi setelah autentikasi. Untuk informasi selengkapnya, lihat Azure Active Directory B2C: Mendaftarkan aplikasi Anda. Anda perlu mengetahui ID Aplikasi yang ditetapkan ke aplikasi Anda, yang tercantum setelah nama aplikasi dalam tampilan properti. Cuplikan layar berikut menunjukkan tempat menemukan ID Aplikasi:

ID Aplikasi dalam tampilan properti aplikasi Azure

Microsoft Authentication Library mengharapkan URL Pengalihan untuk aplikasi Anda menjadi ID Aplikasi Anda yang diawali dengan teks "msal", dan diikuti dengan titik akhir yang disebut "auth". Jika ID Aplikasi Anda adalah "1234abcd", URL lengkapnya harus msal1234abcd://auth. Pastikan aplikasi Anda telah mengaktifkan pengaturan Klien asli dan membuat URI Pengalihan Kustom menggunakan ID Aplikasi Anda seperti yang ditunjukkan pada cuplikan layar berikut:

URI Pengalihan Kustom dalam tampilan properti aplikasi Azure

URL akan digunakan nanti di Android ApplicationManifest.xml dan iOS Info.plist.

Dalam proyek sampel, edit file Constants.cs untuk mengatur clientId bidang ke ID Aplikasi Anda. Kode berikut menunjukkan bagaimana nilai ini harus diatur jika ID Aplikasi Anda adalah 1234abcd:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    ...
}

Membuat kebijakan pendaftaran dan masuk, dan lupa kebijakan kata sandi

Kebijakan adalah pengalaman yang dilalui pengguna untuk menyelesaikan tugas seperti membuat akun atau mengatur ulang kata sandi. Kebijakan juga menentukan konten token yang diterima aplikasi saat pengguna kembali dari pengalaman. Anda harus menyiapkan kebijakan untuk pendaftaran dan masuk akun, dan mengatur ulang kata sandi. Azure memiliki kebijakan bawaan yang menyederhanakan pembuatan kebijakan umum. Untuk informasi selengkapnya, lihat Azure Active Directory B2C: Kebijakan bawaan.

Setelah menyelesaikan penyiapan kebijakan, Anda harus memiliki dua kebijakan dalam tampilan Alur pengguna (kebijakan) di portal Azure. Cuplikan layar berikut menunjukkan dua kebijakan yang dikonfigurasi dalam portal Azure:

Dua kebijakan yang dikonfigurasi dalam tampilan alur Pengguna Azure (kebijakan)

Dalam proyek sampel, edit file Constants.cs untuk mengatur policySignin bidang dan policyPassword untuk mencerminkan nama yang Anda pilih selama penyiapan kebijakan:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    static readonly string policySignin = "B2C_1_signupsignin1";
    static readonly string policyPassword = "B2C_1_passwordreset";
    ...
}

Menggunakan Microsoft Authentication Library (MSAL) untuk autentikasi

Paket NuGet Microsoft Authentication Library (MSAL) harus ditambahkan ke proyek bersama, .NET Standard, dan proyek platform dalam solusi Xamarin.Forms . MSAL mencakup PublicClientApplicationBuilder kelas yang membangun objek yang mematuhi IPublicClientApplication antarmuka. MSAL menggunakan With klausul untuk menyediakan parameter tambahan ke metode konstruktor dan autentikasi.

Dalam proyek sampel, kode di belakang untuk App.xaml mendefinisikan properti statis bernama AuthenticationClient dan UIParent, dan membuat instans AuthenticationClient objek di konstruktor. Klausul ini WithIosKeychainSecurityGroup menyediakan nama grup keamanan untuk aplikasi iOS. Klausul ini WithB2CAuthority menyediakan Otoritas default, atau kebijakan, yang akan digunakan untuk mengautentikasi pengguna. Klausa WithRedirectUri memberi tahu instans Azure Notification Hubs URI Pengalihan mana yang akan digunakan jika beberapa URI ditentukan. Contoh berikut menunjukkan cara membuat instans PublicClientApplication:

public partial class App : Application
{
    public static IPublicClientApplication AuthenticationClient { get; private set; }

    public static object UIParent { get; set; } = null;

    public App()
    {
        InitializeComponent();

        AuthenticationClient = PublicClientApplicationBuilder.Create(Constants.ClientId)
            .WithIosKeychainSecurityGroup(Constants.IosKeychainSecurityGroups)
            .WithB2CAuthority(Constants.AuthoritySignin)
            .WithRedirectUri($"msal{Constants.ClientId}://auth")
            .Build();

        MainPage = new NavigationPage(new LoginPage());
    }

    ...

Catatan

Jika instans Azure Notification Hubs Anda hanya memiliki satu URI Pengalihan yang ditentukan, AuthenticationClient instans mungkin berfungsi tanpa menentukan URI Pengalihan dengan WithRedirectUri klausa. Namun, Anda harus selalu menentukan nilai ini jika konfigurasi Azure Anda diperluas untuk mendukung klien atau metode autentikasi lainnya.

Penanganan OnAppearing aktivitas di kode LoginPage.xaml.cs di belakang panggilan AcquireTokenSilentAsync untuk menyegarkan token autentikasi untuk pengguna yang telah masuk sebelumnya. Proses autentikasi mengalihkan ke LogoutPage jika berhasil dan tidak melakukan apa pun pada kegagalan. Contoh berikut menunjukkan proses autentikasi ulang senyap di OnAppearing:

public partial class LoginPage : ContentPage
{
    ...

    protected override async void OnAppearing()
    {
        try
        {
            // Look for existing account
            IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();

            AuthenticationResult result = await App.AuthenticationClient
                .AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
                .ExecuteAsync();

            await Navigation.PushAsync(new LogoutPage(result));
        }
        catch
        {
            // Do nothing - the user isn't logged in
        }
        base.OnAppearing();
    }

    ...
}

Penanganan OnLoginButtonClicked aktivitas (diaktifkan saat tombol Masuk diklik) memanggil AcquireTokenAsync. Pustaka MSAL secara otomatis membuka browser perangkat seluler dan menavigasi ke halaman masuk. URL masuk, yang disebut Otoritas, adalah kombinasi dari nama penyewa dan kebijakan yang ditentukan dalam file Constants.cs . Jika pengguna memilih opsi lupa kata sandi, mereka dikembalikan ke aplikasi dengan pengecualian, yang meluncurkan pengalaman lupa kata sandi. Contoh berikut menunjukkan proses autentikasi:

public partial class LoginPage : ContentPage
{
    ...

    async void OnLoginButtonClicked(object sender, EventArgs e)
    {
        AuthenticationResult result;
        try
        {
            result = await App.AuthenticationClient
                .AcquireTokenInteractive(Constants.Scopes)
                .WithPrompt(Prompt.SelectAccount)
                .WithParentActivityOrWindow(App.UIParent)
                .ExecuteAsync();

            await Navigation.PushAsync(new LogoutPage(result));
        }
        catch (MsalException ex)
        {
            if (ex.Message != null && ex.Message.Contains("AADB2C90118"))
            {
                result = await OnForgotPassword();
                await Navigation.PushAsync(new LogoutPage(result));
            }
            else if (ex.ErrorCode != "authentication_canceled")
            {
                await DisplayAlert("An error has occurred", "Exception message: " + ex.Message, "Dismiss");
            }
        }
    }

    ...
}

Metode OnForgotPassword ini mirip dengan proses masuk tetapi menerapkan kebijakan kustom. OnForgotPasswordmenggunakan kelebihan beban yang berbeda dari AcquireTokenAsync, yang memungkinkan Anda untuk memberikan Otoritas tertentu. Contoh berikut menunjukkan cara menyediakan Otoritas kustom saat memperoleh token:

public partial class LoginPage : ContentPage
{
    ...
    async Task<AuthenticationResult> OnForgotPassword()
    {
        try
        {
            return await App.AuthenticationClient
                .AcquireTokenInteractive(Constants.Scopes)
                .WithPrompt(Prompt.SelectAccount)
                .WithParentActivityOrWindow(App.UIParent)
                .WithB2CAuthority(Constants.AuthorityPasswordReset)
                .ExecuteAsync();
        }
        catch (MsalException)
        {
            // Do nothing - ErrorCode will be displayed in OnLoginButtonClicked
            return null;
        }
    }
}

Bagian akhir autentikasi adalah proses keluar. Metode OnLogoutButtonClicked ini dipanggil ketika pengguna menekan tombol keluar. Ini mengulangi semua akun dan memastikan token mereka telah dibatalkan. Sampel di bawah ini menunjukkan implementasi keluar:

public partial class LogoutPage : ContentPage
{
    ...
    async void OnLogoutButtonClicked(object sender, EventArgs e)
    {
        IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();

        while (accounts.Any())
        {
            await App.AuthenticationClient.RemoveAsync(accounts.First());
            accounts = await App.AuthenticationClient.GetAccountsAsync();
        }

        await Navigation.PopAsync();
    }
}

iOS

Di iOS, skema URL kustom yang terdaftar di Azure Active Directory B2C harus terdaftar di Info.plist. MSAL mengharapkan skema URL mematuhi pola tertentu, yang dijelaskan sebelumnya di Mendaftarkan aplikasi seluler Anda dengan Azure Active Directory B2C. Cuplikan layar berikut menunjukkan skema URL kustom di Info.plist.

MSAL juga memerlukan Pemberian Kepemilikan Rantai Kunci di iOS, yang terdaftar di Entitilements.plist, seperti yang ditunjukkan pada cuplikan layar berikut:

Saat Azure Active Directory B2C menyelesaikan permintaan otorisasi, azure Active Directory B2C akan dialihkan ke URL pengalihan terdaftar. Skema URL kustom menghasilkan iOS meluncurkan aplikasi seluler dan meneruskan URL sebagai parameter peluncuran, di mana diproses oleh OpenUrl penimpaan kelas aplikasi AppDelegate , dan mengembalikan kontrol pengalaman ke MSAL. Implementasi OpenUrl ditunjukkan dalam contoh kode berikut:

using Microsoft.Identity.Client;

namespace TodoAzure.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        ...
        public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
        {
            AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
            return base.OpenUrl(app, url, options);
        }
    }
}

Android

Di Android, skema URL kustom yang terdaftar di Azure Active Directory B2C harus terdaftar di AndroidManifest.xml. MSAL mengharapkan skema URL mematuhi pola tertentu, yang dijelaskan sebelumnya di Mendaftarkan aplikasi seluler Anda dengan Azure Active Directory B2C. Contoh berikut menunjukkan skema URL kustom dalam AndroidManifest.xml.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.xamarin.adb2cauthorization">
  <uses-sdk android:minSdkVersion="15" />
  <application android:label="ADB2CAuthorization">
    <activity android:name="microsoft.identity.client.BrowserTabActivity">
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- example -->
        <!-- <data android:scheme="msalaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" android:host="auth" /> -->
        <data android:scheme="INSERT_URI_SCHEME_HERE" android:host="auth" />
      </intent-filter>
    </activity>"
  </application>
</manifest>

Kelas MainActivity harus dimodifikasi untuk menyediakan UIParent objek ke aplikasi selama OnCreate panggilan. Saat Azure Active Directory B2C menyelesaikan permintaan otorisasi, azure Active Directory B2C mengalihkan ke skema URL terdaftar dari AndroidManifest.xml. Skema URI terdaftar menghasilkan Android yang memanggil OnActivityResult metode dengan URL sebagai parameter peluncuran, di mana ia diproses oleh SetAuthenticationContinuationEventArgs metode .

public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(bundle);

        Forms.Init(this, bundle);
        LoadApplication(new App());
        App.UIParent = this;
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
    }
}

Platform Windows Universal

Tidak diperlukan penyiapan tambahan untuk menggunakan MSAL pada Platform Windows Universal

Jalankan proyek

Jalankan aplikasi pada perangkat virtual atau fisik. Mengetuk tombol Masuk harus membuka browser dan menavigasi ke halaman tempat Anda dapat masuk atau membuat akun. Setelah menyelesaikan proses masuk, Anda harus dikembalikan ke halaman keluar aplikasi. Cuplikan layar berikut menunjukkan layar masuk pengguna yang berjalan di Android dan iOS: