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 WinUI'nin yanı sıra WPF ve WinForms gibi diğer masaüstü uygulamalarında 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. tr-TR: Kolay ad genellikle uygulamaya sağlanan bir addır, ancak uygulamanızın bir yönetici anahtarı sağlaması, geçerli SmartCardPinPolicy örneğini oluşturması ve ardından her üç değeri RequestVirtualSmartCardCreationAsync'a geçirmesi 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ı ele alma
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 kodu, bir kimlik doğrulama eylemini nasıl tamamlayacağımızı ve akıllı kart ile sanal akıllı kart bilgilerine nasıl değişiklik uygulanacağını inceleyeceğimiz bu konunun geri kalanında birçok kez referans alarak göreceksiniz.
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.
Kart veya okuyucu çıkarıldığında olay işleyicisi olarak uygulamanızın davranışını tanımlayan yöntemle bu olayın kart okuyucusuyla ilişkilendirilmesini sağlayı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ınarak ve ardından SmartCardProvisioning nesnesinden RequestVirtualSmartCardDeletionAsync çağrısı çalıştırılarak programatik olarak gerçekleştirilir.
bool result = await SmartCardProvisioning
.RequestVirtualSmartCardDeletionAsync(card);
İlgili içerik
Windows developer