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:
- Membuat penyewa Azure Active Directory B2C.
- Daftarkan aplikasi seluler Anda dengan penyewa Azure Active Directory B2C.
- Buat kebijakan untuk pendaftaran dan masuk, dan lupa alur pengguna kata sandi.
- 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:
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:
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:
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:
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. OnForgotPassword
menggunakan 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: