Mengaktifkan pembuatan kode QR untuk aplikasi pengautentikasi TOTP di ASP.NET Core Blazor Web App
Artikel ini menjelaskan cara mengonfigurasi ASP.NET Core Blazor Web App dengan pembuatan kode QR untuk aplikasi pengautentikasi TOTP.
Untuk pengenalan autentikasi dua faktor (2FA) dengan aplikasi pengautentikasi menggunakan Algoritma Kata Sandi Satu Kali Berbasis Waktu (TOTP), lihat Mengaktifkan pembuatan kode QR untuk aplikasi pengautentikasi TOTP di ASP.NET Core.
Perancah komponen Aktifkan Authenticator ke dalam aplikasi
Ikuti panduan dalam Perancah Identity dalam proyek ASP.NET Core untuk perancah Pages\Manage\EnableAuthenticator
ke dalam aplikasi.
Catatan
Meskipun hanya EnableAuthenticator
komponen yang dipilih untuk perancah dalam contoh ini, perancah saat ini menambahkan semua Identity komponen ke aplikasi. Selain itu, pengecualian dapat dilemparkan selama proses perancah ke dalam aplikasi. Jika pengecualian terjadi saat migrasi database terjadi, hentikan aplikasi dan mulai ulang aplikasi pada setiap pengecualian. Untuk informasi selengkapnya, lihat Pengecualian perancah untuk Blazor Aplikasi Web (dotnet/Scaffolding
#2694).
Bersabarlah saat migrasi dijalankan. Tergantung pada kecepatan sistem, diperlukan waktu hingga satu atau dua menit agar migrasi database selesai.
Untuk informasi selengkapnya, lihat Perancah Identity dalam proyek ASP.NET Core. Untuk panduan tentang menggunakan .NET CLI alih-alih Visual Studio, lihat perintah dotnet aspnet-codegenerator.
Menambahkan kode QR ke halaman konfigurasi 2FA
Instruksi ini menggunakan qrcode.js Shim Sangmin: Generator QRCode lintas browser untuk JavaScript (davidshimjs/qrcodejs
repositori GitHub).
qrcode.min.js
Unduh pustaka ke wwwroot
folder proyek server solusi. Pustaka tidak memiliki dependensi.
App
Di komponen (Components/App.razor
), tempatkan referensi skrip pustaka setelah <script>
Blazortag:
<script src="qrcode.min.js"></script>
Komponen EnableAuthenticator
, yang merupakan bagian dari sistem kode QR di aplikasi dan menampilkan kode QR kepada pengguna, mengadopsi penyajian sisi server statis (SSR statis) dengan navigasi yang ditingkatkan. Oleh karena itu, skrip normal tidak dapat dijalankan saat komponen dimuat atau diperbarui di bawah navigasi yang ditingkatkan. Langkah tambahan diperlukan untuk memicu kode QR untuk dimuat di UI saat halaman dimuat. Untuk mencapai pemuatan kode QR, pendekatan yang dijelaskan dalam ASP.NET Core Blazor JavaScript dengan penyajian sisi server statis (SSR statis) diadopsi.
Tambahkan penginisialisasi JavaScript berikut ke folder proyek wwwroot
server. Tempat {NAME}
penampung harus menjadi nama perakitan aplikasi agar Blazor dapat menemukan dan memuat file secara otomatis. Jika nama rakitan aplikasi server adalah BlazorSample
, file diberi nama BlazorSample.lib.module.js
.
wwwroot/{NAME}.lib.module.js
:
const pageScriptInfoBySrc = new Map();
function registerPageScriptElement(src) {
if (!src) {
throw new Error('Must provide a non-empty value for the "src" attribute.');
}
let pageScriptInfo = pageScriptInfoBySrc.get(src);
if (pageScriptInfo) {
pageScriptInfo.referenceCount++;
} else {
pageScriptInfo = { referenceCount: 1, module: null };
pageScriptInfoBySrc.set(src, pageScriptInfo);
initializePageScriptModule(src, pageScriptInfo);
}
}
function unregisterPageScriptElement(src) {
if (!src) {
return;
}
const pageScriptInfo = pageScriptInfoBySrc.get(src);
if (!pageScriptInfo) {
return;
}
pageScriptInfo.referenceCount--;
}
async function initializePageScriptModule(src, pageScriptInfo) {
if (src.startsWith("./")) {
src = new URL(src.substr(2), document.baseURI).toString();
}
const module = await import(src);
if (pageScriptInfo.referenceCount <= 0) {
return;
}
pageScriptInfo.module = module;
module.onLoad?.();
module.onUpdate?.();
}
function onEnhancedLoad() {
for (const [src, { module, referenceCount }] of pageScriptInfoBySrc) {
if (referenceCount <= 0) {
module?.onDispose?.();
pageScriptInfoBySrc.delete(src);
}
}
for (const { module } of pageScriptInfoBySrc.values()) {
module?.onUpdate?.();
}
}
export function afterWebStarted(blazor) {
customElements.define('page-script', class extends HTMLElement {
static observedAttributes = ['src'];
attributeChangedCallback(name, oldValue, newValue) {
if (name !== 'src') {
return;
}
this.src = newValue;
unregisterPageScriptElement(oldValue);
registerPageScriptElement(newValue);
}
disconnectedCallback() {
unregisterPageScriptElement(this.src);
}
});
blazor.addEventListener('enhancedload', onEnhancedLoad);
}
Tambahkan komponen bersama PageScript
berikut ke aplikasi server.
Components/PageScript.razor
:
<page-script src="@Src"></page-script>
@code {
[Parameter]
[EditorRequired]
public string Src { get; set; } = default!;
}
Tambahkan file yang dikolokasi JS berikut untuk EnableAuthenticator
komponen, yang terletak di Components/Account/Pages/Manage/EnableAuthenticator.razor
. Fungsi ini onLoad
membuat kode QR dengan pustaka Sangmin qrcode.js
menggunakan URI kode QR yang diproduksi oleh GenerateQrCodeUri
metode di blok komponen @code
.
Components/Account/Pages/Manage/EnableAuthenticator.razor.js
:
export function onLoad() {
const uri = document.getElementById('qrCodeData').getAttribute('data-url');
new QRCode(document.getElementById('qrCode'), uri);
}
<PageTitle>
Di bawah komponen dalam EnableAuthenticator
komponen, tambahkan PageScript
komponen dengan jalur ke file yang dikolokasiJS:
<PageScript Src="./Components/Account/Pages/Manage/EnableAuthenticator.razor.js" />
Catatan
Alternatif untuk menggunakan pendekatan dengan PageScript
komponen adalah menggunakan pendengar peristiwa (blazor.addEventListener("enhancedload", {CALLBACK})
) yang terdaftar di penginisialisasi afterWebStarted
JS untuk mendengarkan pembaruan halaman yang disebabkan oleh navigasi yang ditingkatkan. Panggilan balik ({CALLBACK}
tempat penampung) melakukan logika inisialisasi kode QR.
Menggunakan pendekatan panggilan balik dengan enhancedload
, kode dijalankan untuk setiap navigasi yang ditingkatkan, bahkan ketika kode <div>
QR tidak dirender. Oleh karena itu, kode tambahan harus ditambahkan untuk memeriksa keberadaan <div>
sebelum menjalankan kode yang menambahkan kode QR.
<div>
Hapus elemen yang berisi instruksi kode QR:
- <div class="alert alert-info">
- Learn how to <a href="https://go.microsoft.com/fwlink/?Linkid=852423">enable
- QR code generation</a>.
- </div>
Temukan dua <div>
elemen tempat kode QR akan muncul dan tempat data kode QR disimpan di halaman.
Lakukan perubahan berikut:
- Untuk yang kosong
<div>
, berikan elemenid
dariqrCode
. <div>
Untuk dengandata-url
atribut , berikan elemenid
dariqrCodeData
.
- <div></div>
- <div data-url="@authenticatorUri"></div>
+ <div id="qrCode"></div>
+ <div id="qrCodeData" data-url="@authenticatorUri"></div>
Ubah nama situs dalam GenerateQrCodeUri
metode EnableAuthenticator
komponen. Nilai defaultnya adalah Microsoft.AspNetCore.Identity.UI
. Ubah nilai menjadi nama situs yang bermakna yang dapat diidentifikasi pengguna dengan mudah di aplikasi pengautentikasi mereka bersama kode QR lainnya untuk aplikasi lain. Biarkan URL nilai dikodekan. Pengembang biasanya menetapkan nama situs yang cocok dengan nama perusahaan. Contoh: Yahoo, Amazon, Etsy, Microsoft, Zoho.
Dalam contoh berikut, {SITE NAME}
tempat penampung adalah tempat nama situs (perusahaan):
private string GenerateQrCodeUri(string email, string unformattedKey)
{
return string.Format(
CultureInfo.InvariantCulture,
AuthenticatorUriFormat,
- UrlEncoder.Encode("Microsoft.AspNetCore.Identity.UI"),
+ UrlEncoder.Encode("{SITE NAME}"),
UrlEncoder.Encode(email),
unformattedKey);
}
Jalankan aplikasi dan pastikan kode QR dapat dipindai dan kode divalidasi.
EnableAuthenticator
komponen dalam sumber referensi
Komponen EnableAuthenticator
dapat diperiksa di sumber referensi:
EnableAuthenticator
komponen dalam sumber referensi
Catatan
Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Sumber Daya Tambahan:
ASP.NET Core
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk