Makale Özeti

Yazmış olduğumuz uygulamalarda authentication genellikle kullanıcı adı ve şifre ile yapılmaktadır. Authorization ise role based security prensibine göre yapılmaktadır. Ayrıca kullanıcıların bir domain'de bulunmaları durumunda authentication domain credential'larına göre de yapılabilmektedir. Authentication için kullanılan birden fazla yöntem söz konusudur, ancak ben bu makalemde sizlere çok sıklıkla kullanılan genel yöntemlerden farklı bir yöntemden bahsedeceğim. Makaledeki amacımız piyasadan rahatlıkla bulunan usb bellekler ile yapılabilecek bir authentication mekanizması ile bir programı sadece belirli bir diske sahip kişinin çalıştırmasının nasıl sağlanabileceğidir.

Makale

Merhabalar,

Yazmış olduğumuz uygulamalarda authentication genellikle kullanıcı adı ve şifre ile yapılmaktadır. Authorization ise role based security prensibine göre yapılmaktadır. Ayrıca kullanıcıların bir domain'de bulunmaları durumunda authentication domain credential'larına göre de yapılabilmektedir. Authentication için kullanılan birden fazla yöntem söz konusudur, ancak ben bu makalemde sizlere çok sıklıkla kullanılan genel yöntemlerden farklı bir yöntemden bahsedeceğim. Makaledeki amacımız piyasadan rahatlıkla bulunan usb bellekler ile yapılabilecek bir authentication mekanizması ile bir programı sadece belirli bir diske sahip kişinin çalıştırmasının nasıl sağlanabileceğidir. Bu özellik sadece Windows uygulamalarında kullanılabilir olacaktır ve kullanıcı usb belleği takmadığı sürece uygulamayı çalıştıramayacaktır. Bu yöntemin avantajı kullanıcının uygulamayı farklı bilgisayarlarda kullanabilecek olmasıdır. Bu özellik için her diskin kendisine ait benzersiz bir id'si olduğu bilgisini kullanacağız. Bu bilgiyi WMI kullanarak okuyacak ve bu bilgi eşliğinde kullanıcıyı authenticate edip, yine bu bilgiye göre authorize edebileceğiz.

Şimdi isteseniz kodu inceleyelim, sonrasında ise bu yöntem üzerinde yapabileceğimiz diğer geliştirmeleri tartışalım.

Yeni bir Windows uygulaması oluşturuyoruz ve uygulamanın Program.cs dosyasını aşağıdaki şekilde düzenliyoruz:
 

static class Program
{
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        ///

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (CheckIfDiskIsInserted())
                Application.Run(new Form1());
        }

         static bool CheckIfDiskIsInserted(
         {
            ManagementObjectSearcher
mos = new ManagementObjectSearcher();
            mos.Query = new ObjectQuery("SELECT * From Win32_DiskDrive");
            foreach
(ManagementObject mo in mos.Get())
            {
                if
(mo["PNPDeviceID"].ToString() == @"USBSTOR\DISK&VEN_SONY&PROD_STORAGE_MEDIA&REV_1.00\A304050400186&0")
                {
                    return
true;
                }
            }
            return
false;
        }
}


Main metodunda CheckIfDiskIsInserted fonksiyonunu çağırıyoruz. Bu fonksiyon uygulamayı çalıştırdığımız anda uygulamanın çalışması için gerekli olan diskin bilgisayara takılı olup olmadığını kontrol edecek. Takılı ise true, takılı değilse false değerini döndürecek. Bu işlemi ManagementObject nesnesi ile gerçekleştireceğiz. ManagementObject nesnesini uygulamalarımızda kullanmak için ilk olarak System.Management namespace'ini uygulamamıza referans olarak eklemeliyiz. Ardından yarattığımız bir ManagementObjectSearcher nesnesi ile basit bir select sorgusu yazıyoruz. "SELECT * From Win32_DiskDrive" sorgusunu ManagementObjectSearcher nesnesinin Query property'sine atadıktan sonra Get metodu ile sisteme takılı olan tüm diskleri alabiliriz. Get metodu ile sistemdeki disklerin bilgileri bir ManagementObject nesnesi şeklinde döner. Biz ise bu ManagementObject nesnesinin PNPDeviceID property'sine göre bir ayrıştırma yapacağız ve eğer takılı olan disklerden bir tanesinin PNPDeviceID'si kodda belirttiğimiz değere eşitse (
USBSTOR\DISK&VEN_SONY&PROD_STORAGE_MEDIA&REV_1.00\A304050400186&0) fonksiyonumuz true değer dönecek. Eğer değilse false değer dönecek.

Main metodumuzda da bu fonksiyonun döndüğü değere göre uygulamamızı çalıştırıyoruz. Metodumuz eğer bizim belirlediğimiz diski bulmuşsa uygulamamız çalışacak, bulmamışsa çalışmayacaktır.

Bu yöntemi daha da geliştirip diske bir autorun.inf yazarak programın otomatik olarak çalışmasını sağlayabiliriz. Bu sayede disk takılınca uygulamamız otomatik olarak çalışır. Kullanıcıları hard coded biçimde kontrol etmek yerine veritabanından da kontrol edebiliriz. Her kullanıcı için ayrı bir disk PNPDeviceID'si tanımlayarak şifre girmeden sadece disk ile authtentication'ı yapabiliriz. İstenirse çift güvenlik için diskin içinde bir dosyada kullanıcı adı ve şifreyi encrypted bir şekilde yazabiliriz. Uygulamamızın güvenliğini sadece USB bellek değil işlemci seri numarası veya HDD ve işlemci seri numarasına göre de sağlayabiliriz. Bu bilgileri de yine WMI kullanarak basit bir şekilde elde edebiliriz. WMI konusunda daha detaylı bilgi için WMI makalelerimi inceleyebilirsiniz.

Umarım faydalı olmuştur.

Işıl ORHANEL