Makale Özeti

ASP.NET ile uygulama geliştiriyorsanız uygulamalarınız hayata geçtiğinde herkese açık olacaktır. Web sitesi geliştirmenin temel mantığı da budur aslında bir web sitesi tasarlarken web sitesine daha fazla ziyaretçi çekecek olan tasarımlar üzerine yoğunlaşır ve sitemizin trafiğini arttırmaya uğraşırız hatta pek çok web sitesine çeşitli reklamlar koyularak siteye gelen ziyaretçilerin bu reklamlara tıklamasını sağlayarak ziyaretçiler üzerinden gelir elde edilmeye çalışılır. Bu kadar geniş kitlelere açık olan bir uygulama geliştirmenin avantajı olduğu kadar dezavantajı da vardır sitenizi yayına verdikten sonra sitenizde bulunan her kullanıcı eğer bir güvenlik ve yetkilendirme sisteminiz yoksa her sayfanıza erişebilecektir. HTML ile bir site yapıyorsanız bu pek problem değildir ama ASP.NET gibi içeriğin dinamik olarak yönetilebildiği bir teknoloji ile uygulama geliştiriyorsanız sitenizde bulunan her ziyaretçinin her sayfaya girmesi pek doğru olmayacaktır. İşte bu noktada güvenlik kavramı önem kazanıyor, daha önceleri bu işlemleri durum yönetimi teknikleri ile yapabiliyorduk ama ASP.NET'in bize sunmuş olduğu güvenlik ve yetkilendirme modeli ile sitemizin güvenlik politikasını yönetmek hem daha güvenli hem de daha kolay olacaktır.

Makale

Authentication ve Authorization

ASP.NET'teki güvenlik modellerinden bahsetmeden önce ilk olarak Authentication ve Authorization kavramlarından bahsetmek istiyorum.

Authentication: Authentication sözcüğünün anlamı kimlik denetimidir. Aslında kimlik denetimi sözcüğü bu kelimeyi yeterli miktarda açıklıyor sanırım. Authentication ile ziyaretçinin en genel şekilde bir yere girip giremeyeceği belirleniyor. Gerçek hayattan bir örnek verirsek, bir apartman düşünün sizin apartmana girmek için apartman kapısını açmanız gerekiyor ama evinize girmek için sadece apartman kapısını açmış olamak size yetmeyecektir.

Authorization: Bu sözcükte izin, yetki anlamına gelmektedir. Kullanıcı kimlik denetiminden (Authentication) geçtikten sonra nerelere erişim hakkı olduğu bu kavramla belirlenmektedir. Az önce bahsetmiş olduğu apartman örneğine geri dönelim. Evinize giderken apartman kapısını açtınız (Authentication) ve apartmana girdiniz. Apartman içindeki dairelerden hangisine girebileceğiniz (Authorization) elinizde bulunan daire kapılarını açabilecek anahtar sayısıyla sınırlıdır. 

ASP.NET Güvenlik Modları

ASP.NET bize 3 farklı tipte güvenlik modu sunar. Bunlar Windows Tabanlı Güvenlik, Form Tabanlı Güvenlik ve Passport.

Windows Tabanlı Güvenlik: Uyulama IIS düzeyinde korunur ve Windows veya bağlı olunan domaindeki kullanıcılar üzerinden güvenlik sağlanır. Windows tabanlı güvenlik genellikle bir kurum içinde çalışan Internet'e açılmayan intranet'te çalışacak olan uygulamalar için kullanılır. Mevcut sistemde bulunan kullanıcıların uygulamaya erişmesi denetlenmiş olur.

Form Tabanlı Güvenlik: Güvenlik ASP.NET formları üzerinden sağlanıyor. Kullanıcıya bir kullanıcı adı ve şifre verilerek gerekli yerlerde bu şifre denetlenerek güvenlik sağlanır. Form Tabanlı Güvenlik Internet uygulamaları için biçilmiş kaftandır. ASP.NET 2.0'la birlikte Form Tabanlı Güvenlikte kullanılmak üzere yazılım geliştiricilere hazır kontroller kurulmuştur, sürükle ve bırak yöntemi ile çok kolay bir şekilde dakikalar içinde uygulamada bu kontrolleri kullanabiliyoruz. SQL Server Express desteği ile tüm ayarlar otomatik olarak yapılıyor.

Passport: Uygulamayı Microsoft tarafından sağlanan merkezi güvenlik sistemi ile koruyabiliyoruz. Bu sistem hepimizin bildiği Messenger'da oturum açarken ya da Hotmail hesabımızı kontrol ederken kullandığımız sistemden farklı değil. Sitenize giriş yapacak olan kullanıcıların herhangi bir Microsoft Passport'u olması yeterli. Bu sistemi kullanmak için Microsoft'tan bu hizmeti satın almanız gerekiyor.

Güvenlik Ayarını Yapmak

Bildiğiniz gibi ASP.NET'deki uygulama ayarları web.config adındaki XML dosyasında saklanıyordu. Tahmin edersiniz ki güvenlik ayarlarını yaparken de web.config'i kullanıyor olacağız. Güvenlik ayarlarının nasıl yapıldığına değinmeden önce ilk olarak web.config üzerinde birazcık durmak istiyorum. web.config dosyası sadece bulunduğu klasör ve bulunduğu klasörün altında bulunan klasöre etki eder. Yandaki resmi göz önüne aldığımızda en altta bulunan web.config dosyası sitede bulunan tüm dosyalara ve alt klasörlere etki eder. Üyeler klasörü içinde bulunan web.config dosyası üyeler klasörü içinde bulunan dosya ve klasörlere etki edecektir. Peki aynı ayarlar hem en üstte bulunan web.config'de hem de alt klasörlerde varsa ne olacak? Bu gibi durumlarda hiyerarşik olarak en altta bulunan dosyada bulunan ayarlar geçerli olacaktır. Yandaki resimde gördüğünüz site için güvenlik ayarı yapılmak istenildiğinde sadece web.config dosyalarında bu ayarları yapmamız yeterli olacaktır. Örneğin Yönetim Bölümüne sadece bu alana giriş izni olan kullanıcıların girmesini istediğimizde web.config'e bir iki satır kod yazarak tüm klasör için güvenlik ayarlarını yapmış olacağız keza Üyeler bölümü içinde iş bu kadar basittir.

Web.config üzerinde bu kadar konuştuktan sonra şimdi sıra geldi güvenlik ayarlarını web.config üzerinde nasıl yapacağımıza.

<system.web>

<authentication mode="Windows|Forms|Passport|None">
</authentication>

</system.web>

Web.config içinde güvenlik ayarlarını <system.web> altında bulunan <authentication> düğümünden yapıyoruz. Bu alanda sitenin hangi güvenlik modunu kullanacağı belirtiliyor. Burada Windows, Forms ve Passport'tan daha önce bahsetmiştik. Bunlardan herhangi birini seçerek sitemizin seçilen modla korunmasını sağlamış oluyoruz. Eğer None seçeneğini seçersek sitemiz için herhangi bir güvenlik politikası kullanmayacağımız anlamına geliyor. Şimdi dilerseniz güvenlik modları teker teker inceleyelim. İlk olarak Windows Tabanlı Güvenlik'ten (Windows Authentication) başlıyor olalım.

Windows Tabanlı Güvenlik

Windows Tabanlı Güvenliğin intranet uygulamaları için daha uygun olduğunu belirtmiştim.Windows Tabanlı Güvenlikte kullanıcılar uygulamanın çalıştırıldığı makine üzerinde bulunan kullanıcılardan ya da uygulamanın çalıştığı dahil olduğu domainden alınıyordu. Bu güvenlik modunda IIS kullanıcının bilgileri denetleniyor eğer bu adım başarısız olursa kullanıcının kullanıcı  adı ve şifresini girebileceği bir Popup çıkarılıyor.

Windows tabanlı güvenlik modunu kullanabilmek için ilk olarak sisteme kullanıcı eklemeliyiz. Bilgisayarı kullanmak için oturum açtığınız kullanıcı zaten burada bulunacaktır ama biz yeni bir kullanıcı oluşturup bu işin nasıl yapıldığını görüyor olalım.

Bu işlemi yapmak için:

  1. Başlat→Denetim Masası→Yönetimsel Araçlar→Bilgisayar Yönetimi yolu ile Bilgisayar Yönetimi penceresini açalım burada Yerel Kullanıcılar ve Gruplar düğümünü genişletip Users bölümüne geçelim.
  2. Users'ın üzerine sağ tıklayıp yeni kullanıcıyı seçelim. Karşımıza yeni bir tane pencere açılacaktır. Bu alandan kullanıcının bilgilerini doldurup Kullanıcının ilk oturumda şifre değiştirmesini gerektirmeyecek şekilde işareti kaldıralım.
  3. Oluştura tıklayıp kullanıcıyı oluşturalım.

Artık WinDeneme adlı kullanıcımızı denemelerimizde kullanabiliriz. Şimdi bu kullanıcının görüntüleyebileceği bir sayfa tasarlayalım. Yukarıda web.config'den bahsetmiş olduğum proje üzerinden ilerleyelim. Resme baktığımızda Yönetim Bölümüne sadece bizim istediğimiz kullanıcılar girmesini isteyebiliriz. Bu işlem için ilk olarak klasörün içinde bulunan web.config'de tüm kullanıcıların buraya girmesini engelleyen aşağıdaki kodu yazalım.

<system.web>

  <authorization>

            <deny users="*"/>

  </authorization>

</system.web>

Bu kodlar ile Yönetim Bölümüne tüm kullanıcıların girmesini engellemiş oluyoruz. Şimdi uygulamamızı çalıştırıp ilgili klasöre erişmeye çalışalım.

Yönetim Bölümü içindeki sayfalardan birine erişmeye çalıştığımızda yukarıda gördüğünüz uyarıyı alacağız çünkü tüm kullanıcıların buraya girmesini az önce yasakladık. Şimdi az önce oluşturduğumuz WinDeneme ve benim sistemimde bulunan şu anda çalışmakta olduğum Burak Batur kullanıcısı için bu klasöre erişme izni verelim.Bu işlem için web.config dosyasını aşağıdaki şekilde düzenlemek gerekiyor.

<system.web>

  <authorization>

        <allow users="BilgisayarAdi\Burak Batur"/>

        <allow users="BilgisayarAdi\WinDeneme"/>

        <deny users="*"/>

  </authorization>

</system.web>

Bu ayarlarla iki kullanıcıya Yönetim Bölümüne erişim hakkı vermiş olduk. Burak Batur kullanıcısı ile Yönetim Bölümüne yeniden girmeye çalışıyorum ve aşağıdaki görüntü ile karşılaşıyorum.

Küçük bir örneğin ardından örnekte kullanmış olduğumuz yeni karşılaştığımız kavramlardan bahsedelim.

Allow: Allow düğümü ile ilgili alana erişim yetkisi verilecek olan kişi ve gruplar belirtiliyor.
Deny: Deny düğümü ile ilgili alana erişimi yasaklanan kişi ve gruplar belirtliyor.

Allow ve Deny düğümlerinin özeliklerine bakalım
Users: Bu alana kullanıcı isimleri belirtiliyor. İlgili işleme göre burada belirtilen kullanıcıların hakları belirleniyor.
Roles: Bu alana rol gruplarının isimleri girilerek o rol grubunda bulunan kullanıcıların tümünün hakları belirtiliyor.
Verbs: Bu alana HTTP iletim metotlarının isimleri belirtilerek ilgili alan üzerinde o metodun hakları belirtiliyor.

Şimdi bu özelliklerin kullanımını biraz daha yakından inceleyelim. Az önceki örneğimizdeki kodlara dikkat ettiyseniz,

<allow users="*" />

şeklinde bir ifade kullandık. Burada * kullanarak tüm kullanıcıların sisteme girmesini yasaklamış olduk. * az önceki cümleden de anlaşılacağı gibi tümü anlamına geliyor. Users'ta kullanabildiğimiz gibi Roles'de de kullanabilirdik.

İfade içinde * yerine ? de kullanabilirdik. Yani;

<deny users="?" />

şeklinde bir ifade tanımlayabilirdik. Bu ifadenin anlamı oturum açmamış olan yani tüm anonim kullanıcıları yasakla anlamına gelmektedir. Böylece ?, anonim kullanıcılar anlamına gelmektedir. Uygulamalarımızda ?'ni sıklıkla kullanırız. Eğer rol tabanlı bir sistem geliştirmiyorsak yani sistemde sadece tek bir yetki varsa sadece <deny users="?" /> ile güvenlik ayarını yapmak yeterli olacaktır.

ASP.NET'te kullanıcı haklarını belirleyebildiğimiz gibi bir rolün hakkını da belirleyebiliyoruz.  Bu işlem için tıpkı user ekler gibi bir rol ekleyelim.

  1. Başlat→Denetim Masası→Yönetimsel Araçlar→Bilgisayar Yönetimi yolu ile Bilgisayar Yönetimi penceresini açalım burada Yerel Kullanıcılar ve Gruplar düğümünü genişletip Gruplar bölümüne geçelim.
  2. Gruplar'ın üzerine sağ tıklayıp yeni kullanıcıyı seçelim. Karşımıza yeni bir tane pencere açılacaktır. Bu alandan Grubun bilgilerini doldurup bir tane de üye ekleyelim.
  3. Oluştur'a tıklayıp Grubu oluşturalım.

Bu rolü <allow roles="SiteYonetici" /> şeklinde kullanabilirsiniz. Bu role dahil olan tüm kullanıcılara ilgili alana giriş izni verilecektir.

HTTP İletim Metotlarının Yetkilerini Yönetmek
Kullanıcılar ve Gruplar üzerinde yetkilendirme tanımlayabildiğimiz gibi HTTP iletim metotları üzerinde de yetkilendirme yapabiliyoruz. Bu işlemi yukarıda açıkladığım gibi Verbs düğümü ile yapabiliyoruz.

<deny verbs="GET, DEBUG" />

Yukarıdaki kod bloğunu incelediğimizde HTTP protokolü üzerinden siteye gelecek olan GET ve DEBUG metotları bu site için çalıştırılmayacaktır. Verbs özelliği içinde kullanılabilecek olan HTTP iletim metotları POST, GET, HEAD, ve DEBUG'dır.

Bu makalemizde ASP.NET 2.0'daki güvenlik kavramına giriş yaptık ve Windows Tabanlı Güvenlik üzerinde durduk. Bir sonraki makalemizde Form Tabanlı Güvenlik kavramından bahsediyor olacağım.

Burak Batur
www.burakbatur.com

Kaynak: MSDN, Wrox - Professional Asp Net 2.0 - 2006, Microsoft Press Microsoft Asp Dot Net 2.0 Step By Step Aug 2005, Introducing ASP.NET 2.0