Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Web Service SoapHeader İle Guvenlik

Merhaba,
Web Service uygulamalarında güvenliğin ne kadar önemli olduğunu ve iki türlü güvenlik olduğunu, Web Service Session Bazlı Güvenlik yazımda bahsetmiştim.Başlıktanda anlaşılacağı gibi Session bazlı güvenliği o yazımda anlatmış bulunmaktayım.
Şimdi ise Web Service’lerde SoapHeader ile güvenliğin nasıl alındığını inceleyeceğiz.
Bir önceki yazımında olduğu gibi malzeme ismi ve adet sayısını oluşturduğumuz Web Service alacak ve bunu belirtilen herhangi bir veri kaynağına işleyecektir.Bu durumun SoapHeader ile güvenliğini alalım.Öncelikle bir Web Service oluşturalım ve gerekli metodumuzu hazırlayalım.

Tabi öncelikle bu yazımı okumadan önce Web Service Kullanımı ve Web Service Oluşturma başlıklı yazılarımı okumanızı tavsiye ederim.

Ben NeKacAdet.asmx adında bir Web Service oluşturuyorum.

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class NeKacAdet : System.Web.Services.WebService
    {
        [WebMethod]
        public void SiparisVer(int Adet, string UrunAdi)
        {
            StreamWriter SiparisKayit = new StreamWriter("C:/Dosya/SiparisKayit.txt", true);
            //C:/Dosya/SiparisKayit.txt dosyasının mevcut olduğunu varsayıyorum.
            SiparisKayit.WriteLine("Ürün Adı=" + UrunAdi);
            SiparisKayit.WriteLine("Urun Adedi=" + Adet);
            SiparisKayit.Close();
        }
    }

Yukarıdaki kodları incelerseniz eğer, NeKacAdet.asmx adındaki Web Service’imizin içine “SiparisVer” adında int ve string tipinde iki parametre alan bir metod yazdık.Gördüğünüz gibi temel senaryomuzu gerçekleştiren ama güvenliği olmayan bir metod.Şu durumda Web Service’i kullanan birisi binlerce kez gereksiz sipariş yapabilir.Bizim için sistemimizde bulunan ya da bizim belirlediğimiz kullanıcıların bu Web Service’den sipariş vermelerini sağlamaktır.

Web Service’imizi projemize yükler ve SiparisVer() ismindeki metodumuzu gerekli parametrelerde çalıştırırsak gördüğünüz gibi(sizinde denediğinizi varsayıyorum) gayet güzel bir şekilde SiparisKayit.txt dosyasına verilemizi eklemiştir.

Ben kendi projeme “NeKacAdet” isminde bu Web Service’i ekliyorum.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        NeKacAdet.NeKacAdetSoapClient NeKac = new NeKacAdet.NeKacAdetSoapClient();
        private void Form1_Load(object sender, EventArgs e)
        {
            NeKac.SiparisVer(5, "Kalem");
        }
    }

Formumuz yüklendiği anda Web Service’imizdeki “SiparisVer” adındaki metodumuzu gerekli parametrelerini doldurup çağırıyoruz.Eğer “C:/Dosya/SiparisKayit.txt” dizinini açarsak, dosyamızda gerekli verilerin kaydedildiğini görüyoruz.
Şimdi SoapHeader ile bu Web Service’imize güvenlik uygulaması yapalım.
Öncelikle SoapHeader güvenliğini almak istiyorsak, Web Service’imizin bulunduğu projede bir class oluşturmalı ve bu classın System.Web.Services.Protocols Namespace’inde bulunan SoapHeader sınıfından kalıtım aldırmalıyız.Güvenlik şartlarımızı bu sınıfta şemalandırmalıyız.

Örneğimize devam edersek eğer; Web Service’imizin bulunduğu projeye SoapHeaderGuvenlik.cs adında bir sınıf açıyorum ve bu sınıfa SoapHeader sınıfından kalıtım aldırıyorum.Senaryo olarak sadece kullanıcı adı ve parola alacağım için bu iki değeri taşıyacak propertyleri oluşturuyorum

    public class SoapHeaderGuvenlik:SoapHeader
    {
        public string KullaniciAdi { get; set; }
        public string Sifre { get; set; }
    }

Yukarıda görüğünüz gibi alacağımız güvenliğin şartlarına uygun iki adet propertyi yazmış bulunmaktayız.Şimdi NeKacAdet.asmx adındaki Web Service’imize gelip, oluşturduğumuz bu class ile nasıl güvenlik alınıyormuş onu inceleyelim.

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class NeKacAdet : System.Web.Services.WebService
    {
        public SoapHeaderGuvenlik KullaniciKontrol;
        //Web Service'imizin bulunduğu projemizde oluşturduğumuz SoapHeaderGuvenlik.cs sınıfından bir referans oluşturuyoruz.
        //Dikkat ederseniz nesnesini almıyoruz.
        [WebMethod]
        public bool SiparisVer(int Adet, string UrunAdi)
        {
            if (KullaniciKontrol.KullaniciAdi == "Gencay" && KullaniciKontrol.Sifre == "123321")
            {
                StreamWriter SiparisKayit = new StreamWriter("C:/Dosya/SiparisKayit.txt", true);
                SiparisKayit.WriteLine("Ürün Adı=" + UrunAdi);
                SiparisKayit.WriteLine("Urun Adedi=" + Adet);
                SiparisKayit.Close();
                return true;
            }
            return false;
        }
    }

Gördüğünüz gibi NeKacAdet.asmx Web Service’imizdeki “SiparisVer” adındaki metodumuzu değiştiriyoruz.Burada dikkat etmeniz gereken oluşturduğumuz SoapHeaderGuvenlik.cs adındaki sınıfımızdan bir referans noktası alıyoruz.Ancak nesnesini almıyoruz ve bu referans noktasını kullanarak kullanıcı adı ve şifre kontrolü yapıyoruz.Burada ben manuel olarak kullanıcı adını “Gencay” şifreyi ise “123321” olarak yazdım.Sizler bunları parametre olarak alabilirsiniz.
Ayriyetten SiparisVer metodu geriye bool tipinde değer göndermesini istedim.Eğer true gönderirse, demek ki verilerin kayıdı yapılmış, false ise yapılmamış olduğunu anlayacağız ve ona göre mesaj verdireceğiz.

Şimdi bu Web Service’imizi kullandığımız projemize gelip “NeKacAdet” adındaki Web Service’imize sağ tıklayıp “Update Service Referance” diyerek, Web Service’imizin son versiyonunu güncelliyoruz.

        NeKacAdet.NeKacAdetSoapClient NeKac = new NeKacAdet.NeKacAdetSoapClient();

        private void Form1_Load(object sender, EventArgs e)
        {
            if (NeKac.SiparisVer(50, "Silgi"))
                MessageBox.Show("Kayıt Yapılmıştır.");
            else
            {
                MessageBox.Show("Kullanıcı adı ve şifrenizi kontrol ediniz.");
            }
        }

Eğer bu şekilde kodları çalıştırırsanız, “NullReferanceException” adındaki hatayla karşılaşacaksınız.Bu hata bize

Object reference not set to an instance of an object.

mesajını verecektir.
Bu hatayı vurgulamaya çalıştığım yeri gösterebilmek için nerede verdiğinide sizlere göstermem lazım.Bu yüzden aşağıdaki ekran görüntüsünü inceleyiniz.
Hata
Gördüğünüz gibi “SoapHeaderGuvenlik” tipinden “KullaniciKontrol” adındaki, referansımızda vermektedir.
Bu ne demektir?
Biz “SoapHeaderGuvenlik.cs” sınıfının bir referansını kullandık ama nesnesini üretmedik.Bu referansın içindeki güvenlik şartları olan kullanıcı adı ve şifresini kontrol edip metodun işlevini ona göre değerlendirdik.Ama nesnesi oluşmamış bir referans verileri nerde, nasıl, hangi mantıkla tutabilir.Eee o halde bizim bu nesneyi oluşturmamız gerekiyor.
Bu nesneyi “SiparisVer” isimli metodumuzu web metod olarak gösteren [WebMethod] attribute’un yanına [SoapHeader(“ReferansAdi”)] attribute’unu yazarak oluşturabiliriz.

        public SoapHeaderGuvenlik KullaniciKontrol;
        [WebMethod][SoapHeader("KullaniciKontrol")]
        public bool SiparisVer(int Adet, string UrunAdi)
        {
            if (KullaniciKontrol.KullaniciAdi == "Gencay" && KullaniciKontrol.Sifre == "123321")
            {
                StreamWriter SiparisKayit = new StreamWriter("C:/Dosya/SiparisKayit.txt", true);
                SiparisKayit.WriteLine("Ürün Adı=" + UrunAdi);
                SiparisKayit.WriteLine("Urun Adedi=" + Adet);
                SiparisKayit.Close();
                return true;
            }
            return false;
        }

Yukarıda gördüğünüz gibi [SoapHeader(“KullaniciKontrol”)] attribute’u sayesinde SoapHeaderGuvenlik tipinden olan KullaniciKontrol referansına bir nesne bağlıyoruz.

Şimdi tekrardan Web Service’imizi update ederek projemizde “SiparisVer” metodunu inceliyoruz.

Görüntüde gördüğünüz gibi, [SoapHeader(“KullaniciKontrol”)] attribute’u sayesinde SoapHeaderGuvenlik tipinden KullaniciKontrol referansına nesneyi bağlamıştık.Söz konusu attribute “SiparisVer” metodunun attribute’u olduğu içinde, metodu kullanırken ilk parametre olarak SoapHeaderGuvenlik tipinden otomatik olarak bizden nesne istemektedir.

Buradaki mantığı anlamanızı istiyorum.[SoapHeader(“KullaniciKontrol”)] attribute’u ile “SiparisVer” metodunda SoapHeader güvenliğini yapacağımız, SoapHeader sınıfından kalıtım almış, SoapHeaderGuvenlik adındaki sınıfın referansına nesne bağlattırıyoruz.Bu nesneyide bu metodu kullanırken, proje tarafından kullanıcıdan istemektedir.

Şimdi kafalarınızdaki soruyu tahmin edebiliyorum.
Peki bu nesneyi Web Service kullanıcısı nasıl, nerden bulacakta bu parametreye verecek.

NeKacAdet namespace’i üzerinden SoapHeaderGuvenlik sınıfı üzerinden erişebileceğiz.
Aşağıdaki kodları incelersek eğer,

        NeKacAdet.NeKacAdetSoapClient NeKac = new NeKacAdet.NeKacAdetSoapClient();
        NeKacAdet.SoapHeaderGuvenlik GuvenlikNesnesi = new NeKacAdet.SoapHeaderGuvenlik();
        //Gördüğünüz gibi NeKacAdet namespace'i üzerinden SoapHeaderGuvenlik sınıfının instance'ını aldık.
        private void Form1_Load(object sender, EventArgs e)
        {
            GuvenlikNesnesi.KullaniciAdi = "Gencay";
            GuvenlikNesnesi.Sifre = "123321";
            //Bu instance'ın "KullaniciAdi" ve "Sifre" propertylerine gerekli değerlerini girdik.
            if (NeKac.SiparisVer(GuvenlikNesnesi,50,"Silgi"))
                MessageBox.Show("Kayıt Yapılmıştır.");
            else
            {
                MessageBox.Show("Kullanıcı adı ve şifrenizi kontrol ediniz.");
            }
        }

Sonuç olarak kullanıcı adı ve şifreyi doğru girerseniz “Kayıt Yapılmıştır.” mesajı alacaksınız.Aksi taktirde diğer kayıt işlemi yapılmayacaktır.

Evet artık yazımızın sonuna gelmiş bulunmaktayız.Umarım SoapHeader ile güvenlikte aşinalığınız olmuştur.
Faydalanmanız dileğiyle..
İyi Çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Emre Öztürk dedi ki:

    peki bir soru bu webservis’e javascript’ten istek atıldığında nasıl bir yol izlenecek ? servis parolası ve şifresini javascripten yazamam anlamsız olur ve ben güvenlik bilgisini javascript üzerinden nasıl göndericem.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*