Kartu pintar
Topik ini menjelaskan bagaimana aplikasi Windows dapat menggunakan kartu pintar untuk menghubungkan pengguna ke layanan jaringan yang aman, termasuk cara mengakses pembaca kartu pintar fisik, membuat kartu pintar virtual, berkomunikasi dengan kartu pintar, mengautentikasi pengguna, mengatur ulang VPN pengguna, dan menghapus atau memutuskan sambungan kartu pintar.
API Windows Runtime (WinRT) untuk kartu pintar adalah bagian dari Windows Software Development Kit (SDK). API ini dibuat untuk digunakan dalam aplikasi Platform Windows Universal (UWP), tetapi juga dapat digunakan di aplikasi WinUI atau di aplikasi desktop paket, termasuk WPF dan Formulir Windows. Untuk informasi selengkapnya tentang menggunakan API WinRT di aplikasi desktop Windows Anda, lihat Memanggil API Windows Runtime di aplikasi desktop.
Mengonfigurasi manifes aplikasi
Sebelum aplikasi Anda dapat mengautentikasi pengguna menggunakan kartu pintar atau kartu pintar virtual, Anda harus mengatur kemampuan Sertifikat Pengguna Bersama dalam proyek Package.appxmanifest file proyek WinUI atau proyek pengemasan Anda.
Mengakses pembaca kartu yang terhubung dan kartu pintar
Anda dapat mengkueri pembaca dan melampirkan kartu pintar dengan meneruskan ID perangkat (ditentukan dalam DeviceInformation) ke metode SmartCardReader.FromIdAsync . Untuk mengakses kartu pintar yang saat ini dilampirkan ke perangkat pembaca yang dikembalikan, panggil SmartCardReader.FindAllCardsAsync.
string selector = SmartCardReader.GetDeviceSelector();
DeviceInformationCollection devices =
await DeviceInformation.FindAllAsync(selector);
foreach (DeviceInformation device in devices)
{
SmartCardReader reader =
await SmartCardReader.FromIdAsync(device.Id);
// For each reader, we want to find all the cards associated
// with it. Then we will create a SmartCardListItem for
// each (reader, card) pair.
IReadOnlyList<SmartCard> cards =
await reader.FindAllCardsAsync();
}
Anda juga harus mengaktifkan aplikasi untuk mengamati peristiwa CardAdded dengan menerapkan metode untuk menangani perilaku aplikasi pada penyisipan kartu.
private void reader_CardAdded(SmartCardReader sender, CardAddedEventArgs args)
{
// A card has been inserted into the sender SmartCardReader.
}
Anda kemudian dapat meneruskan setiap objek SmartCard yang dikembalikan ke SmartCardProvisioning untuk mengakses metode yang memungkinkan aplikasi Anda mengakses dan menyesuaikan konfigurasinya.
Membuat kartu pintar virtual
Untuk membuat kartu pintar virtual menggunakan SmartCardProvisioning, aplikasi Anda harus terlebih dahulu memberikan nama yang mudah diingat, kunci admin, dan SmartCardPinPolicy. Nama yang mudah diingat umumnya adalah sesuatu yang disediakan untuk aplikasi, tetapi aplikasi Anda masih perlu menyediakan kunci admin dan menghasilkan instans SmartCardPinPolicy saat ini sebelum meneruskan ketiga nilai ke RequestVirtualSmartCardCreationAsync.
- Membuat instans baru SmartCardPinPolicy
- Hasilkan nilai kunci admin dengan memanggil CryptographicBuffer.GenerateRandom pada nilai kunci admin yang disediakan oleh layanan atau alat manajemen.
- Teruskan nilai-nilai ini bersama dengan string FriendlyNameText ke RequestVirtualSmartCardCreationAsync.
var pinPolicy = new SmartCardPinPolicy
{
MinLength = 6
};
IBuffer adminkey = CryptographicBuffer.GenerateRandom(24);
SmartCardProvisioning provisioning = await
SmartCardProvisioning.RequestVirtualSmartCardCreationAsync(
"Card friendly name",
adminkey,
pinPolicy);
Setelah RequestVirtualSmartCardCreationAsync mengembalikan objek SmartCardProvisioning terkait, kartu pintar virtual disediakan dan siap digunakan.
Catatan
Untuk membuat kartu pintar virtual menggunakan aplikasi Windows yang dikemas, pengguna yang menjalankan aplikasi harus menjadi anggota grup administrator. Jika pengguna bukan anggota grup administrator, pembuatan kartu pintar virtual akan gagal.
Menangani tantangan autentikasi
Untuk mengautentikasi dengan kartu pintar atau kartu pintar virtual, aplikasi Anda harus memberikan perilaku untuk menyelesaikan tantangan antara data kunci admin yang disimpan di kartu, dan data kunci admin yang dikelola oleh server autentikasi atau alat manajemen.
Kode berikut menunjukkan cara mendukung autentikasi kartu pintar untuk layanan atau modifikasi detail kartu fisik atau virtual. Jika data yang dihasilkan menggunakan kunci admin pada kartu ("tantangan") sama dengan data kunci admin yang disediakan oleh server atau alat manajemen ("adminkey"), autentikasi berhasil.
static class ChallengeResponseAlgorithm
{
public static IBuffer CalculateResponse(IBuffer challenge, IBuffer adminkey)
{
if (challenge == null)
throw new ArgumentNullException("challenge");
if (adminkey == null)
throw new ArgumentNullException("adminkey");
SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.TripleDesCbc);
var symmetricKey = objAlg.CreateSymmetricKey(adminkey);
var buffEncrypted = CryptographicEngine.Encrypt(symmetricKey, challenge, null);
return buffEncrypted;
}
}
Anda akan melihat kode ini direferensikan di seluruh sisa topik ini adalah kami meninjau cara menyelesaikan tindakan autentikasi, dan cara menerapkan perubahan pada kartu pintar dan informasi kartu pintar virtual.
Memverifikasi respons autentikasi kartu pintar atau kartu pintar virtual
Sekarang setelah kita memiliki logika untuk tantangan autentikasi yang ditentukan, kita dapat berkomunikasi dengan pembaca untuk mengakses kartu pintar, atau sebagai alternatif, mengakses kartu pintar virtual untuk autentikasi.
- Untuk memulai tantangan, panggil GetChallengeContextAsync dari objek SmartCardProvisioning yang terkait dengan kartu pintar. Ini akan menghasilkan instans SmartCardChallengeContext, yang berisi nilai Tantangan kartu.
- Selanjutnya, berikan nilai tantangan kartu dan kunci admin yang disediakan oleh layanan atau alat manajemen ke ChallengeResponseAlgorithm yang kami tentukan dalam contoh sebelumnya.
- VerifyResponseAsync akan mengembalikan true jika autentikasi berhasil.
bool verifyResult = false;
SmartCard card = await rootPage.GetSmartCard();
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
SmartCardChallengeContext context =
await provisioning.GetChallengeContextAsync();
IBuffer response = ChallengeResponseAlgorithm.CalculateResponse(
context.Challenge,
rootPage.AdminKey);
verifyResult = await context.VerifyResponseAsync(response);
Mengubah atau mereset PIN pengguna
Untuk mengubah PIN yang terkait dengan kartu pintar:
- Akses kartu dan buat objek SmartCardProvisioning terkait.
- Panggil RequestPinChangeAsync untuk menampilkan UI kepada pengguna untuk menyelesaikan operasi ini.
- Jika PIN berhasil diubah, panggilan akan mengembalikan true.
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
bool result = await provisioning.RequestPinChangeAsync();
Untuk meminta reset PIN:
- Panggil RequestPinResetAsync untuk memulai operasi. Panggilan ini mencakup metode SmartCardPinResetHandler yang mewakili kartu pintar dan permintaan reset pin.
- SmartCardPinResetHandler menyediakan informasi bahwa ChallengeResponseAlgorithm kami, dibungkus dalam panggilan SmartCardPinResetDeferral, menggunakan untuk membandingkan nilai tantangan kartu dan kunci admin yang disediakan oleh layanan atau alat manajemen untuk mengautentikasi permintaan.
- Jika tantangan berhasil, panggilan RequestPinResetAsync selesai; mengembalikan true jika PIN berhasil direset.
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
bool result = await provisioning.RequestPinResetAsync(
(pinResetSender, request) =>
{
SmartCardPinResetDeferral deferral =
request.GetDeferral();
try
{
IBuffer response =
ChallengeResponseAlgorithm.CalculateResponse(
request.Challenge,
rootPage.AdminKey);
request.SetResponse(response);
}
finally
{
deferral.Complete();
}
});
}
Menghapus kartu pintar atau kartu pintar virtual
Ketika kartu pintar fisik dihapus , peristiwa CardRemoved akan diaktifkan saat kartu dihapus.
Kaitkan penembakan peristiwa ini dengan pembaca kartu dengan metode yang menentukan perilaku aplikasi Anda pada kartu atau penghapusan pembaca sebagai penanganan aktivitas. Perilaku ini bisa menjadi sesuatu sekadar memberikan pemberitahuan kepada pengguna bahwa kartu telah dihapus.
reader = card.Reader;
reader.CardRemoved += HandleCardRemoved;
Penghapusan kartu pintar virtual ditangani secara terprogram dengan terlebih dahulu mengambil kartu dan kemudian memanggil RequestVirtualSmartCardDeletionAsync dari objek yang dikembalikan SmartCardProvisioning .
bool result = await SmartCardProvisioning
.RequestVirtualSmartCardDeletionAsync(card);
Konten terkait
Windows developer