12 Mart 2012 Pazartesi

Web Service'lerinde Güvenlik 1

Giriş

Şirketiniz bayilik sistemi ile çalışıyor ve siz Türkiye üzerinde bulunan bayi ağınızın merkezdeki stok bilgilerini görüntüleyebilmesi ve siparişlerini geçebilmelerini sağlayan Web Service uygulaması geliştirdiniz. Ancak Web Service üzerinden dağıttığınız bu bilgiler gizli ve adresi bilen – veya bulan – herkesin bu Web Servisi kullanmasını istemiyorsunuz. O halde Web Service ini kullanan istemcinin kendini tanıtması gerekiyor. Yazımızın konusu Web Service’lerinde güvenliği sağlamak.
Web Service’ini Session kullanmaya hazırlamak

Öncelikle web uygulamalarının stateless ( durumunu koruyamayan ) olduğunu vurgulayalım.

Bir Windows uygulamasında tanımladığınız global bir değişkene bir değer atayın, sonra bir çay demleyin, hatta tatile çıkın sahil sahil güzide memleketimizi dolaşın geri döndüğünüzde eğer bilgisayarınız hiç kapanmamışsa global değişkene atadığınız değeri hala okuyabildiğinizi görürsünüz. Bu, Windows uygulamalarının statefull ( durumunu koruyabilen ) bir özelliği olduğunu gösterir.

Ancak web uygulamalarında durum böyle değildir. Bir web uygulamasında tanımladığınız global bir değişkenin ömrü bir göz açıp kapama süresinden azdır. Web uygulamalarının çalışma mantığına kısaca bir göz atalım.

Bir web dosyasının yaşam ömrü 4 fazdan oluşmaktadır :

1- Page_Initilazed : WebForm da  tanımlanan kontrol ve değişkenler tanımlanır,
2- Page_Load : Sayfa yüklenirken çalışan metod.
3- Event : Eğer gerçekleşmişse bir olay yada olaylar çalışır.
4-Page_Dispose : İlk sayfada tanımlanan kontrol ve değişkenler RAM den silinir.

Görüldüğü gibi 4ncü fazda bütün kontrol ve değişkenler RAM den siliniyor. Dolayısıyla Web Service’leri de bir web uygulaması olduğu için durumunu koruyamazlar.

Web uygulamalarında sayfalar arası veri taşımak için kullandığımız Session nesnesini ise Web Service’lerinde direk olarak kullanamıyoruz. Session nesnesini kullandığımız her metodun başında [WebMethod(EnableSession=true)]eklememiz gerkiyor.


    [WebMethod(EnableSession=true)]
    public bool  Login(string username, string password)
    {
        if (username == "selcuk" && password == "123")
        {
            Session["IsAuthenticated"] = "Yes";
            return true;
        }
        else
        {
            Session["IsAuthenticated"] = "No";
            return false;
        }
    }


Yukarıdaki metodumuz bir kullanıcı adı ve parolası alarak kontrol ediyor. Doğru ise Session da açtığımız bir değişkene duruma göre yes ve no değerlerini atıyor ve geriye true|false değer döndürüyor.

Şimdi Session daki değeri kontrol ederek içerik gönderen bir fonksiyon daha yazalım.

    [WebMethod(EnableSession = true)]
    public string SayHello()
    {
        if (Session["IsAuthenticated"] == null)
            return "First Login..";

        if (Session["IsAuthenticated"].ToString() == "Yes")
            return "Hello World.";
        else
            return "Goodbye Blue Sky !";
    }

Bu fonksiyonumuzda önce Session açılıp açılmadığı kontrol ediliyor. Eğer Session açılmamışsa  “First Login..” mesajı geliyor. Eğer Session açılmışsa Session daki değeri kontrol ediyor. Eğer kullanıcı kendini tanıtmışsa “Hello World.”  Yanlış tanıtmamışsa  yada Session süresi dolmuşsa “Goodbye Blue Sky!” şeklinde string döndürecek.

Web Service’lerinde Session kullanabilmek için Web Service geliştiricisi olarak üzerimize düşeni yaptık. Gerisi Web Service’ni kullanan programcıya kalmış.

Windows Uygulamasında SessionID nin saklanması.


Web Service’imizi kullanan programcı bir Web Uygulaması geliştiriyorsa artı bir işlem yapmasına gerek yok. Ancak Web Service’imiz bir Windows uygulaması tarafından kullanılıyorsa Windows Programcısının dikkat etmesi gereken bir nokta var, o da SessionID yi saklamak.

Web Server da açılan her Session için bir SessionID üretilir ve istemciye gönderirilir. Internet Exlporer, Firefox, Opera gibi web browserler ( İnternet tarayıcıları ) bu SessionID yi Cookie mantığı ile saklarlar ve bir dahaki taleple birlikte sakladıkları bu SessionID’yi de gönderir ve bu sayede sunucu kimsenin Session değerini diğer istemcilerin Session değeri ile karıştırmaz.

Geliştirmekte olduğumuz Windows uygulamasının SessionID yi saklayabilmesi içinCookieContainer dan yararlanacağız.

Yazmış olduğumuz Web Service’i sınamak ve CookieContainerı kullanabileceğimiz bir WindowsForm tasarlayalım.


Öncelikle Web Service’imizi kullabilmek için Project menüsünden Add Web Referencediyoruz ve Web Service adresimizi girdikten sonra Add Reference tuşuna basarak projemize ekliyoruz. Yapmış olduğumuz örnekte Web Service’imizi localhost ismiyle kaydettim. Uygulamamız boyunca Web Service’imize bu isimle ulaşacağız.

Bunları belirttikten sonra Formumuzun genel sekmesinde Web Service’imizin ws isimli ,CookieContainer’ın ise cc isimli instance’larını tanımladık. Form’umuzun Load metodunda ise ws nin CookieContainer özelliğine cc isimli CokkieContainer ımızı atıyoruz.

  localhost.Service ws = new localhost.Service();
        System.Net.CookieContainer cc = new System.Net.CookieContainer();

        private void Form1_Load(object sender, EventArgs e)
        {
            ws.CookieContainer = cc;
        }

Windows uygulamamızda yapmamız gerekenler bundan ibaret.

Login butonunda Web Service’imizde bulunan Login isimli fonksiyonu kullanan kodumuzu yazalım.

        private void btnLogin_Click(object sender, EventArgs e)
        {
            if (ws.Login(txtUsername.Text,txtPassword.Text))
                MessageBox.Show("Login Succes");
            else
                MessageBox.Show("Login Failed");
        }


Say Hello butonumuzun altına Web Service’imizde bulunan SayHello metodunun sonucunu MessageBox ta görüntüleyen kodumuzu yazalım.

        private void btnSayHello_Click(object sender, EventArgs e)
        {
            MessageBox.Show(ws.SayHello());
        }

Sonuç


Eğer kullanıcı Login olmadan Say Hello butonuna basarsa Session değerinin null olduğu görülür ve kullanıcı şu mesajı alacaktır :



Kullanıcı Adı ve Parolası doğru girilip Login e basılırsa


Meajını alır ve Session değeri atanır.

Arından Say Hello butonuna bastığında ise mutlu sona ulaşır.


Kullanıcı adı ve parolası yanlış girilirse ve Say Hello butonuna basar ise alacağı mesaj şu şekilde olacaktır.




Kaynak: http://www.mutasyon.net/makaleoku.asp?id=767

Hiç yorum yok: