Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma vysvětluje, jak můžou aplikace pro Windows používat čipové karty k připojení uživatelů k zabezpečeným síťovým službám, včetně přístupu k fyzickým čtečkám čipových karet, vytváření virtuálních čipových karet, komunikace s čipovými kartami, ověřování uživatelů, resetování PIN kódů uživatelů a odebrání nebo odpojení čipových karet.
Rozhraní API prostředí Windows Runtime (WinRT) pro čipové karty jsou součástí sady Windows Software Development Kit (SDK). Tato rozhraní API byla vytvořena pro použití v aplikacích pro Univerzální platformu Windows (UPW), ale dají se použít také v aplikacích WinUI nebo v zabalených desktopových aplikacích, včetně WPF a Windows Forms. Další informace o používání rozhraní API WinRT v desktopové aplikaci pro Windows najdete v tématu Volání rozhraní API prostředí Windows Runtime v desktopových aplikacích.
Konfigurace manifestu aplikace
Než bude aplikace moct ověřovat uživatele pomocí čipových karet nebo virtuálních čipových karet, musíte nastavit funkci Sdílené uživatelské certifikáty v souboru Package.appxmanifest projektu WinUI nebo projektu balení.
Přístup ke čtečkě připojených karet a čipových karet
Dotaz na čtečky a připojené čipové karty můžete zadat předáním ID zařízení (zadaného v DeviceInformation) metodě SmartCardReader.FromIdAsync . Pokud chcete získat přístup k čipové karty, které jsou aktuálně připojeny k vrácenému zařízení čtečky, zavolejte 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();
}
Aplikaci byste také měli umožnit sledovat události CardAdded implementací metody pro zpracování chování aplikace při vkládání karty.
private void reader_CardAdded(SmartCardReader sender, CardAddedEventArgs args)
{
// A card has been inserted into the sender SmartCardReader.
}
Každý vrácený objekt SmartCard pak můžete předat SmartCardProvisioning pro přístup k metodám, které vaší aplikaci umožňují přístup a přizpůsobení jeho konfigurace.
Vytvoření virtuální čipové karty
Pokud chcete vytvořit virtuální čipovou kartu pomocí čipové karty SmartCardProvisioning, bude vaše aplikace nejprve muset zadat popisný název, klíč správce a čipovou kartu SmartCardPinPolicy. Popisný název je obecně k dispozici aplikaci, ale vaše aplikace bude stále muset zadat klíč správce a vygenerovat instanci aktuální smartcardPinPolicy před předáním všech tří hodnot do RequestVirtualSmartCardCreationAsync.
- Vytvoření nové instance SmartCardPinPolicy
- Vygenerujte hodnotu klíče správce voláním CryptographicBuffer.GenerateRandom na hodnotu klíče správce poskytované službou nebo nástrojem pro správu.
- Tyto hodnoty předejte společně s řetězcem FriendlyNameText do RequestVirtualSmartCardCreationAsync.
var pinPolicy = new SmartCardPinPolicy
{
MinLength = 6
};
IBuffer adminkey = CryptographicBuffer.GenerateRandom(24);
SmartCardProvisioning provisioning = await
SmartCardProvisioning.RequestVirtualSmartCardCreationAsync(
"Card friendly name",
adminkey,
pinPolicy);
Jakmile RequestVirtualSmartCardCreationAsync vrátí přidružený objekt SmartCardProvisioning , virtuální čipová karta je zřízena a připravena k použití.
Poznámka:
Aby bylo možné vytvořit virtuální čipovou kartu pomocí zabalené aplikace pro Windows, musí být uživatel, který aplikaci spouští, členem skupiny administrators. Pokud uživatel není členem skupiny Administrators, vytvoření virtuální čipové karty selže.
Řešení problémů s ověřováním
Pokud se chcete ověřit pomocí čipových karet nebo virtuálních čipových karet, musí vaše aplikace poskytovat chování, aby se dokončily výzvy mezi daty klíče správce uloženými na kartě a daty klíče správce udržovanými ověřovacím serverem nebo nástrojem pro správu.
Získání klíče správce
Než budete moct provést ověřování, musíte získat klíč správce. Zdroj klíče správce závisí na vašem scénáři:
- Pro virtuální čipové karty, které jste vytvořili: Použijte stejný klíč správce, který jste vygenerovali při vytváření karty (jak je znázorněno výše v části Vytvoření virtuální čipové karty). Tento klíč byste měli bezpečně uložit pro pozdější použití ověřování.
- Pro existující fyzické nebo virtuální čipové karty: Klíč správce obvykle poskytuje IT oddělení vaší organizace, systém správy karet nebo službu, která kartu vydala.
- Pro vývoj/testování: Pomocí kryptografickéhoBuffer.GenerateRandom můžete vygenerovat klíč správce testu, jak je znázorněno v následujícím příkladu vytvoření virtuální karty.
// Example: Store the admin key from virtual card creation for later use
IBuffer adminkey = CryptographicBuffer.GenerateRandom(24);
// Store this key securely in your app (e.g., in app settings, secure storage, etc.)
// You'll need this same key for authentication operations
SmartCardProvisioning provisioning = await
SmartCardProvisioning.RequestVirtualSmartCardCreationAsync(
"Card friendly name",
adminkey,
pinPolicy);
// Save the adminkey for future authentication
SaveAdminKeySecurely(adminkey);
Příklady metod správy klíčů správce
Tady jsou ukázkové metody, které můžete implementovat k bezpečnému ukládání a načítání klíčů správce:
// Example implementation for storing admin key securely
private void SaveAdminKeySecurely(IBuffer adminKey)
{
// Convert to string for storage (consider encryption for production)
string adminKeyString = CryptographicBuffer.EncodeToBase64String(adminKey);
// Store in app settings (consider using Windows Credential Manager for production)
ApplicationData.Current.LocalSettings.Values["SmartCardAdminKey"] = adminKeyString;
}
// Example implementation for retrieving stored admin key
private IBuffer GetStoredAdminKey()
{
// Retrieve from app settings
string adminKeyString = ApplicationData.Current.LocalSettings.Values["SmartCardAdminKey"] as string;
if (string.IsNullOrEmpty(adminKeyString))
{
throw new InvalidOperationException("Admin key not found. Ensure the smart card was created by this app or the admin key was provided by your IT department.");
}
// Convert back to IBuffer
return CryptographicBuffer.DecodeFromBase64String(adminKeyString);
}
Ověřovací algoritmus
Následující kód ukazuje, jak podporovat ověřování čipových karet pro služby nebo úpravy podrobností o fyzických nebo virtuálních kartách. Pokud jsou data vygenerovaná pomocí klíče správce na kartě ("výzva") stejná jako data klíče správce poskytnutá serverem nebo nástrojem pro správu ("adminkey"), ověřování je úspěšné.
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;
}
}
Tento kód, na který odkazujeme ve zbývající části tohoto tématu, jsme se podívali, jak dokončit akci ověřování a jak použít změny na čipovou kartu a informace o virtuálních čipových kartách.
Ověření odpovědi na ověření čipové karty nebo virtuální čipové karty
Teď, když máme logiku pro definované problémy s ověřováním, můžeme komunikovat se čtečkou pro přístup k čipové kartě nebo případně získat přístup k virtuální čipové kartě pro ověření.
- Chcete-li zahájit výzvu, zavolejte GetChallengeContextAsync z objektu SmartCardProvisioning přidruženého k čipové kartě. Tím se vygeneruje instance SmartCardChallengeContext, která obsahuje hodnotu Challenge karty.
- Dále předejte hodnotu výzvy karty a klíč správce poskytnutý službou nebo nástrojem pro správu do ChallengeResponseAlgorithm , který jsme definovali v předchozím příkladu.
- Pokud ověřování proběhne úspěšně, vrátí funkce VerifyResponseAsynchodnotu True.
bool verifyResult = false;
SmartCard card = await rootPage.GetSmartCard();
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
SmartCardChallengeContext context =
await provisioning.GetChallengeContextAsync();
// Use the admin key that was either:
// 1. Generated during virtual card creation, or
// 2. Provided by your IT department/card management system
IBuffer adminKey = GetStoredAdminKey(); // Your method to retrieve the stored admin key
IBuffer response = ChallengeResponseAlgorithm.CalculateResponse(
context.Challenge,
adminKey);
verifyResult = await context.VerifyResponseAsync(response);
Změna nebo resetování pin kódu uživatele
Změna KÓDU PIN přidruženého k čipové kartě:
- Přejděte na kartu a vygenerujte přidružený objekt SmartCardProvisioning .
- Volání RequestPinChangeAsync k zobrazení uživatelského rozhraní uživateli k dokončení této operace.
- Pokud se PIN kód úspěšně změnil, volání vrátí hodnotu true.
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
bool result = await provisioning.RequestPinChangeAsync();
Žádost o resetování KÓDU PIN:
- Zavolejte RequestPinResetAsync , aby se spustila operace. Toto volání zahrnuje metodu SmartCardPinResetHandler , která představuje čipovou kartu a požadavek na resetování pin kódu.
- SmartCardPinResetHandler poskytuje informace, které náš ChallengeResponseAlgorithm zabalený ve volání SmartCardPinResetDeferral používá k porovnání hodnoty výzvy karty a klíče správce poskytované službou nebo nástrojem pro správu k ověření požadavku.
- Pokud je výzva úspěšná, volání RequestPinResetAsync je dokončeno; pokud se PIN kód úspěšně resetoval, vrátí hodnotu true .
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
bool result = await provisioning.RequestPinResetAsync(
(pinResetSender, request) =>
{
SmartCardPinResetDeferral deferral =
request.GetDeferral();
try
{
// Use the same admin key from card creation or your secure storage
IBuffer adminKey = GetStoredAdminKey(); // Your method to retrieve the stored admin key
IBuffer response =
ChallengeResponseAlgorithm.CalculateResponse(
request.Challenge,
adminKey);
request.SetResponse(response);
}
finally
{
deferral.Complete();
}
});
}
Odebrání čipové karty nebo virtuální čipové karty
Při odebrání fyzické čipové karty se při odstranění karty aktivuje událost CardRemoved .
Přidružte aktivaci této události ke čtečce karet metodou, která definuje chování vaší aplikace na kartě nebo odebrání čtečky jako obslužnou rutinu události. Toto chování může být něco jako poskytnutí oznámení uživateli, že byla karta odebrána.
reader = card.Reader;
reader.CardRemoved += HandleCardRemoved;
Odebrání virtuální čipové karty se zpracovává programově načtením karty a následným voláním RequestVirtualSmartCardDeletionAsync z vráceného objektu SmartCardProvisioning .
bool result = await SmartCardProvisioning
.RequestVirtualSmartCardDeletionAsync(card);
Související obsah
Windows developer