Makale Özeti

Web Servis teknolojisi platformları, mesafeleri, dilleri ve kültürleri aşarak bazı hizmetleri paylaşabilmek amacıyla geliştirilmiştir. Bazen geliştirdiğimiz bu servisler içerik olarak hassas ve önemli bilgiler taşıyabilir ve bu servisleri ancak belirli kişilerin kullanmasına izin verilebilir. İşte bir Web Servis hizmetinin, imtiyaz sahibi belirli kişiler tarafından kullanılmasını sağlamanın en pratik yolu Kimlik Denetimi yapmaktır.

Makale

SOAP Header Kullanarak Web Servislerine Kimlik Denetimi Eklemek

Web Servis teknolojisi platformları, mesafeleri, dilleri ve kültürleri aşarak bazı hizmetleri paylaşabilmek amacıyla geliştirilmiştir. Bazen geliştirdiğimiz bu servisler içerik olarak hassas ve önemli bilgiler taşıyabilir ve bu servisleri ancak belirli kişilerin kullanmasına izin verilebilir. İşte bir Web Servis hizmetinin, imtiyaz sahibi belirli kişiler tarafından kullanılmasını sağlamanın en pratik yolu Kimlik Denetimi yapmaktır.

Bir Web Servis uygulamasında kimlik denetimi SOAP Headers aracılığıyla yapılır. Bu çalışmada üç temel adımımız var:

Birincisi; bir web servisi hazırlamak,
İkincisi; web servisimize kimlik denetimi eklemek,
Üçüncüsü; kimlik denetimli bir web servisini kullanmak.


1. Bir Web Servisi Hazırlamak

Öncelikle web servisi projemizi başlatalım. Bunun için Visul studio.Net te yeni projeler menüsünden proje tipi olarak C# ve Şablon olarak da Web Service seçelim ve proje adını "KimikDenetimliWebServis" olarak tanımlayalım.




Visual Studio bize uygulamamız için gerekli bileşenlerle donatılmış bir proje oluşturur. Bu bileşenlerden biri de Web Servis dosyası olan "Service1.asmx" dir. İsimlendirme için bir çok satır kodu değiştirmekle uğraşmamak için bu dosyayı siliyoruz ve Project menüsünden Add Web Service... seçeneğini tıklayıp uygulamıza BasitAraclar isimli yeni bir Web Service dosyası ekliyoruz.





Evet şimdi projemiz içerisinde "BasitAraclar.asmx" dosyasıyla hazır. Dosyayı kod penceresinde açarak kodumuzu yazmaya başlayabiliriz. Odak noktamız kimlik denetimi olacağından basit bir web metodu yazacağız.


[WebMethod]
public int SayiUret(int altLimit, int ustLimit)
{
Random rastgele=new Random();
return rastgele.Next(altLimit, ustLimit);
}


Metodumuz kendisine verilen altLimit ile ustLimit tamsayıları arasında rastgele bir sayı üreterek bunu çağırıldığı noktaya iletiyor. Kodumuzu hemen test edelim. Ancak çalıştırmadan önce uygulamanın başlangıç noktası olarak web servisimizi tanımlamalıyız. Solution Explorer da BasitAraclar.asmx üzerine sağ tıklayalım ve Set As Start Page diyelim. Şimdi F5 e basarak uygulamamızı çalıştırabiliriz.

BasitAraclar web servisimiz için ekrana gelecek olan web sayfasında bulunan SayiUret linkine tıklayalım. Açılan sayfada metodumuzu denemek amacıyla alt ve üst limitleri girelim ve invoke butonuna basalım.




Butona her tıkladığımızda alt limitle üst limit arasında değişen rastgele üretilmiş sayılar sonuç sayfasıyla bize gönderilecektir.

Şimdi servisimize bu iki int parametreyi, yani altLimit ve ustLimit sayılarını taşıyan mekanizmaya bir bakalım. Web servisleri veri alış verişinde SOAP (Simple Object Access Protocol) kullanırlar. SOAP sayesinde veri platform bağımsız olarak ve güvenlik duvarlarınca engellenmeden her türlü ortama aktarılabilir. Burada konumuz SOAP olmadığından SOAP mesajına genel olarak bir bakmamız yeterli. İki int parametre alan metodun tanımlanışı açıkça belli oluyor.


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="
http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SayiUret xmlns="http://tempuri.org/">
<altLimit>int</altLimit>
<ustLimit>int</ustLimit>
</SayiUret>
</soap:Body>
</soap:Envelope>



Basit bir web servisi hazırladık ve testimizi de yaptık. En son SOAP yapısını da inceleyince birinci aşamayı tamamlamış olduk.



2. Web Servisine Kimlik Denetimi Eklemek


Şimdi de servisimize kimlik denetimi ekleyelim. Bu işlemi basitçe ve adımlar şeklinde gerçekleştireceğiz.


Birinci adım, aşağıdaki isim alanını uygulamamıza ekeleyelim.

using System.Web.Services.Protocols;


İkinci adım, AuthHeader adında SoapHeader classından miras alma yoluyla türetilmiş yeni bir sınıf oluşturalım.

// Kimlik denetimi için kullanılacak sınıf.
public class AuthHeader : SoapHeader
{
public string Username;
public string Password;
}

Sınıfımız iki public üyeye sahip. Bunlar string veri tipinde. Bu üyelerin amacı kullanıcıadı ve parola bilgilerini taşıyarak kimlik denetiminde kullanılmalarını sağlamak.


Üçüncü adım, kimlik denetimi bilgilerini web servis uygulaması içinde kullanılabilir hale getirmek için, BasitAraclar sınıfı içerisinde, tasarladığımız AuthHeader veri tipinde public bir field tanımlamak.

public AuthHeader KimlikDenetimi;


Dördüncü adım, kimlik denetimi yapmak istediğimiz servise bir attribute eklemek.

[SoapHeader("KimlikDenetimi")]


Beşinci adım, web servis uygulamamızda tanımladığımız ve SoapHeader attribute içerisinde referans gösterdiğimiz KimlikDenetim isimli değişkeni kullanarak kod içerisinde denetimimizi gerçekleştirelim.


if(KimlikDenetimi.Username=="test" &&
KimlikDenetimi.Password=="test")
{
// Kimlik denetimi: kullanıcı sistemde tanımlı
Random rastgele=new Random();
return rastgele.Next(altLimit, ustLimit);
}
else
// Kimlik denetimi: kullanıcı yetkisiz
return 0;

Evet buraya kadar olan işlemlerle, kimlik denetimi kullanan bir web servis uygulaması geliştirmiş olduk. Sizin de tahmin edebileceğiniz gibi bu uygulamanın çalıştırılması denetimsiz bir web servisi uygulamasından farklı olacaktır. Bunun için kullanıcı kimlik bilgilerinin SOAP Header’ a yüklenerek web servisine gönderilmesi gerekir. Şimdi F5 tuşuna basarak uygulamamızı çalıştıralım ve yeni SOAP tanımımıza bir göz atalım.


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://tempuri.org/">
<Username>string</Username>
<Password>string</Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<SayiUret xmlns="http://tempuri.org/">
<altLimit>int</altLimit>
<ustLimit>int</ustLimit>
</SayiUret>
</soap:Body>
</soap:Envelope>



Açıkça görüleceği üzere SOAP tanımımıza yeni bir bölüm eklenmiş: HEADER. Güvenlik bilgisi BODY bölümü içerisinde değil HEADER bölümü içerisinde taşınmaktadır. Uygulamayı çalıştırmayı denediyseniz hata sayfasıyla karşılaşmışsınızdır. Bu kaçınılmazdır. Çünkü web servisi yardım sayfasıyla HEADER oluşturmanız mümkün değildir. Şimdi yapmamız gereken kimlik denetimi için gerekli SOAP ı yapılandırabilecek bir uygulama geliştirmek.



3. Kimlik Denetimli Bir Web Servisini Kullanmak


Basit ve hızlı olması nedeniyle "Console" uygulamasını kullanacağız. Öncelikle yeni bir Visual Studio.Net Console Projesi başlatalım ve adını KimlikDenetimliWSTesti diyelim. Hemen arkasından uygulamamıza bir referans ekleyelim.



Add Web Reference.. seçeneğiyle birlikte Web Servisiniyle ilgili bilginin nereden alınacağını tanımlamamızın gerektiği bir ekranla karşılaşacağız. Burada Web services on the local machine seçeneğini kullanarak geliştirdiğimiz örneği bulalım.


Web referans adı olarak DenetimliServis yazalım ve Add Reference butonuna basarak, uygulamamıza referansı ekleyelim.


Şimdi test kodumuzu yazabiliriz. Konsol ekranında kullanıcı ilk olarak alt limit ve üst limit bilgilerini girmesi gerektiği mesajıyla karşılanacak. Kullanıcı alt ve üst limitleri girip Enter a bastığında ilk rastgele sayı üretilecek ve ekrana yazdırılacak. Kullanıcı belirlediği aralıkta başka rastgele sayı üretmek isterse Enter, uygulamadan çıkmak isterse H tuşuna basacak.

Gelelim uygulamadaki en hassa noktaya. Kimlik denetimi için kullanıcı bilgilerinin girileceği nokta... Metod çağırılmadan hemen önce kullanıcı bilgileri tanımlanır ve metodu çağıracak nesneye yüklenir. Gelin koda bir bakalım.

// Metodu çalıştıracak nesne...
DenetimliServis.BasitAraclar arac=new DenetimliServis.BasitAraclar();

// Kimlik bilgilerini taşıyacak nesne
DenetimliServis.AuthHeader header=new DenetimliServis.AuthHeader();

//Kimlik bilgileri yükleniyor.
header.Username="test";
header.Password="test";

//Güvenlik bilgileri metodu çalıştıracak nesneye yükleniyor.
arac.AuthHeaderValue=header;

DenetimliServis isim alanı web servisimizi temsil ediyor. Web servisimizin referansını eklediğimiz anda Visual Studio WSDL dokümanına bakarak iki sınıfı uygulamızda kullanabilmemiz için proxy olarak bizim için yapılandırdı: BasitAraclar ve AuthHeader. Basit araçlar rastgele sayıyı üreten metodu içinde barındıran sınıf. AuthHeader ise kimlik denetimi için gerekli bilgileri taşıyacak olan sınıf. Bu iki sınıf, metod çağırılmadan hemen önce bir yerde buluşmak zorunda.


BasitAraclar sınıfının bir örneği olan arac nesnesinin SayiUret metodu çağırılmadan önce, aac nesnesine kimlik bilgileri yüklenmeli. Bunu gerçekleştirmek için, arac nesnesinin AuthHeaderValue propertisine kimlik bilgilerini yüklediğimiz header nesnesini yüklüyoruz. Böylece kimlik denetimli bir şekilde metodumuzu rahatlıkla çağırabiliriz.

int sayi=arac.SayiUret(altLimit,ustLimit);


Bu makalede basit bir kimlik denetimini bir web servisi üzerinde nasıl gerçekleştirebileceğimizi ve kimlik denetimi kullanan bir web servisini nasıl kullanabileceğimizi gördük. Makalede geliştirilen web servisini kullanan konsol uygulamasının Main metodu tam kodu aşağıdaki gibidir.

Hoşçakalın.
 


[STAThread]
static void Main(string[] args)
{

// Metodu çalıştıracak nesne...
DenetimliServis.BasitAraclar arac=new DenetimliServis.BasitAraclar();

// Kimlik bilgilerini taşıyacak nesne
DenetimliServis.AuthHeader header=new DenetimliServis.AuthHeader();


//Kimlik bilgileri yükleniyor.
header.Username="test";
header.Password="test";

//Güvenlik bilgileri metodu çalıştıracak nesneye yükleniyor.
arac.AuthHeaderValue=header;

//Metod çalıştırılıyor
int ustLimit, altLimit;
Console.Write("Alt limiti girin:");
altLimit=int.Parse(Console.ReadLine());
Console.Write("Üst limiti girin:");
ustLimit=int.Parse(Console.ReadLine());

while(true)
{
int sayi=arac.SayiUret(altLimit,ustLimit);
Console.WriteLine("Üretilen sayı={0}",sayi);
Console.WriteLine("Çıkmak için [H]");
string secim=Console.ReadLine();
if(secim.ToUpper()=="H")
break;
}

}