Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konuda, Windows uygulamalarının fiziksel akıllı kart okuyuculara erişme, sanal akıllı kart oluşturma, akıllı kartlarla iletişim kurma, kullanıcıların kimliğini doğrulama, kullanıcı PIN'lerini sıfırlama ve akıllı kartları kaldırma veya bağlantısını kesme gibi ağ hizmetlerinin güvenliğini sağlamak için kullanıcıları bağlamak için akıllı kartları nasıl kullanabileceği açıklanmaktadır.
Akıllı kartlar için Windows Çalışma Zamanı (WinRT) API'leri , Windows Yazılım Geliştirme Seti'nin (SDK) bir parçasıdır. Bu API'ler Evrensel Windows Platformu (UWP) uygulamalarında kullanılmak üzere oluşturulmuştur, ancak WinUI uygulamalarında veya WPF ve Windows Forms gibi paketlenmiş masaüstü uygulamalarında da kullanılabilir. Windows masaüstü uygulamanızda WinRT API'lerini kullanma hakkında daha fazla bilgi için bkz. Masaüstü uygulamalarında Windows Çalışma Zamanı API'lerini çağırma.
Uygulama bildirimini yapılandırma
Uygulamanızın akıllı kartlar veya sanal akıllı kartlar kullanarak kullanıcıların kimliğini doğrulayabilmesi için önce WinUI projenizin veya paketleme projenizin Package.appxmanifest dosyasında Paylaşılan Kullanıcı Sertifikaları özelliğini ayarlamanız gerekir.
Bağlı kart okuyuculara ve akıllı kartlara erişme
Cihaz kimliğini ( DeviceInformation'da belirtilen) SmartCardReader.FromIdAsync yöntemine geçirerek okuyucuları ve ekli akıllı kartları sorgulayabilirsiniz. Döndürülen okuyucu cihazına bağlı olan akıllı kartlara erişmek için SmartCardReader.FindAllCardsAsync'i çağırın.
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();
}
Ayrıca, kart eklemede uygulama davranışını işlemek için bir yöntem uygulayarak uygulamanızın CardAdded olaylarını gözlemlemesi için etkinleştirmeniz gerekir.
private void reader_CardAdded(SmartCardReader sender, CardAddedEventArgs args)
{
// A card has been inserted into the sender SmartCardReader.
}
Ardından, uygulamanızın yapılandırmasına erişmesine ve yapılandırmasına özelleştirmesine izin veren yöntemlere erişmek için döndürülen her SmartCard nesnesini SmartCardProvisioning'e geçirebilirsiniz.
Sanal akıllı kart oluşturma
SmartCardProvisioning kullanarak sanal akıllı kart oluşturmak için uygulamanızın önce kolay bir ad, yönetici anahtarı ve SmartCardPinPolicy sağlaması gerekir. Kolay ad genellikle uygulamaya sağlanan bir addır, ancak uygulamanızın her üç değeri de RequestVirtualSmartCardCreationAsync'e geçirmeden önce bir yönetici anahtarı sağlaması ve geçerli SmartCardPinPolicy örneğini oluşturması gerekir.
- SmartCardPinPolicy'nin yeni bir örneğini oluşturma
- Hizmet veya yönetim aracı tarafından sağlanan yönetici anahtarı değerinde CryptographicBuffer.GenerateRandom'ı çağırarak yönetici anahtarı değerini oluşturun.
- Bu değerleri FriendlyNameText dizesiyle birlikte RequestVirtualSmartCardCreationAsync'e geçirin.
var pinPolicy = new SmartCardPinPolicy
{
MinLength = 6
};
IBuffer adminkey = CryptographicBuffer.GenerateRandom(24);
SmartCardProvisioning provisioning = await
SmartCardProvisioning.RequestVirtualSmartCardCreationAsync(
"Card friendly name",
adminkey,
pinPolicy);
RequestVirtualSmartCardCreationAsync ilişkili SmartCardProvisioning nesnesini döndürdükten sonra sanal akıllı kart sağlanır ve kullanıma hazırdır.
Uyarı
Paketlenmiş bir Windows uygulaması kullanarak sanal akıllı kart oluşturmak için uygulamayı çalıştıran kullanıcının yöneticiler grubunun bir üyesi olması gerekir. Kullanıcı yöneticiler grubunun üyesi değilse sanal akıllı kart oluşturma başarısız olur.
Kimlik doğrulama zorluklarını işleme
Akıllı kartlarla veya sanal akıllı kartlarla kimlik doğrulaması yapmak için, uygulamanızın kartta depolanan yönetici anahtarı verileriyle kimlik doğrulama sunucusu veya yönetim aracı tarafından tutulan yönetici anahtarı verileri arasındaki zorlukları tamamlama davranışını sağlaması gerekir.
Yönetici anahtarını alma
Kimlik doğrulaması yapabilmeniz için önce yönetici anahtarını almanız gerekir. Yönetici anahtarının kaynağı senaryonuza bağlıdır:
- Oluşturduğunuz sanal akıllı kartlar için: Kart oluşturma sırasında oluşturulan yönetici anahtarının aynısını kullanın (yukarıdaki "Sanal akıllı kart oluşturma" bölümünde gösterildiği gibi). Daha sonra kimlik doğrulaması kullanmak için bu anahtarı güvenli bir şekilde depolamanız gerekir.
- Mevcut fiziksel veya sanal akıllı kartlar için: Yönetici anahtarı genellikle kuruluşunuzun BT departmanı, kart yönetim sistemi veya kartı veren hizmet tarafından sağlanır.
- Geliştirme/test için: Aşağıdaki sanal kart oluşturma örneğinde gösterildiği gibi CryptographicBuffer.GenerateRandom kullanarak bir test yöneticisi anahtarı oluşturabilirsiniz.
// 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);
Örnek yönetici anahtarı yönetim yöntemleri
Yönetici anahtarlarını güvenli bir şekilde depolamak ve almak için uygulayabileceğiniz örnek yöntemler aşağıda verilmiştir:
// 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);
}
Kimlik doğrulama algoritması
Aşağıdaki kod, hizmetler için akıllı kart kimlik doğrulamasını veya fiziksel veya sanal kart ayrıntılarının değiştirilmesini desteklemeyi gösterir. Kartta yönetici anahtarı ("sınama") kullanılarak oluşturulan veriler sunucu veya yönetim aracı ("adminkey") tarafından sağlanan yönetici anahtarı verileriyle aynıysa, kimlik doğrulaması başarılı olur.
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;
}
}
Bu kodun, bu konunun geri kalanında bir kimlik doğrulama eyleminin nasıl tamamlandığını ve akıllı kart ve sanal akıllı kart bilgilerine nasıl değişiklik uygulanacağını gözden geçirmemizdir.
Akıllı kart veya sanal akıllı kart kimlik doğrulaması yanıtlarını doğrulama
Kimlik doğrulama zorluklarının mantığı tanımlandığına göre, akıllı karta erişmek için okuyucuyla iletişim kurabilir veya alternatif olarak kimlik doğrulaması için sanal bir akıllı karta erişebiliriz.
- Sınamaya başlamak için akıllı kartla ilişkilendirilmiş SmartCardProvisioning nesnesinden GetChallengeContextAsync öğesini çağırın. Bu, kartın Sınama değerini içeren bir SmartCardChallengeContext örneği oluşturur.
- Ardından, kartın sınama değerini ve hizmet veya yönetim aracı tarafından sağlanan yönetici anahtarını önceki örnekte tanımladığımız ChallengeResponseAlgorithm'e geçirin.
- Kimlik doğrulaması başarılı olursa VerifyResponseAsynctrue değerini döndürür.
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);
Kullanıcı PIN'ini değiştirme veya sıfırlama
Akıllı kartla ilişkili PIN'i değiştirmek için:
- Karta erişin ve ilişkili SmartCardProvisioning nesnesini oluşturun.
- Kullanıcıya bu işlemi tamamlamak üzere bir kullanıcı arabirimi görüntülemek için RequestPinChangeAsync'i çağırın.
- PIN başarıyla değiştirildiyse çağrı true döndürür.
SmartCardProvisioning provisioning =
await SmartCardProvisioning.FromSmartCardAsync(card);
bool result = await provisioning.RequestPinChangeAsync();
PIN sıfırlama isteğinde bulunmak için:
- İşlemi başlatmak için RequestPinResetAsync'i çağırın. Bu çağrı, akıllı kartı ve pin sıfırlama isteğini temsil eden bir SmartCardPinResetHandler yöntemi içerir.
- SmartCardPinResetHandler, SmartCardPinResetDeferral çağrısına sarmalanmış ChallengeResponseAlgorithm'imizin isteğin kimliğini doğrulamak için kartın sınama değerini ve hizmet veya yönetim aracı tarafından sağlanan yönetici anahtarını karşılaştırmak için kullandığı bilgileri sağlar.
- Sınama başarılı olursa , RequestPinResetAsync çağrısı tamamlanır; PIN başarıyla sıfırlandıysa true döndürür.
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();
}
});
}
Akıllı kartı veya sanal akıllı kartı kaldırma
Fiziksel bir akıllı kart kaldırıldığında kart silindiğinde CardRemoved olayı tetiklenir.
Bu olayın tetiklendiğini kart okuyucusuyla, uygulamanızın kartta davranışını tanımlayan yöntemle ilişkilendirin veya olay işleyicisi olarak okuyucuyu kaldırın. Bu davranış, kullanıcıya kartın kaldırıldığına ilişkin bildirim sağlamak kadar basit bir şey olabilir.
reader = card.Reader;
reader.CardRemoved += HandleCardRemoved;
Sanal akıllı kartın kaldırılması, önce kartı alıp ardından Döndürülen SmartCardProvisioning nesnesinden RequestVirtualSmartCardDeletionAsync çağrılarak program aracılığıyla işlenir.
bool result = await SmartCardProvisioning
.RequestVirtualSmartCardDeletionAsync(card);
İlgili içerik
Windows developer