Makale Özeti

Web Uygulamalarında Güvenlik

Makale

ASP.NET Web Uygulamalarının Güvenliği -3

Form Tabanlı Kimlik Denetimi

 
Form Tabanlı Kimlik Denetimi Nedir?
Form tabanlı kimlik denetimi programcının düzenlediği bir Web Formu ile kimlik bilgilerinin kontrol edilmesi esasına dayanır. 
Düzenlenen bu Web Formu ile kullanıcı kimlik bilgileri Web.config dosyasındaki kullanıcı listesine veya programcı
tarafından düzenlenen ayrı bir veritabanına göre kimlik denetimi ve yetkilendirme yapılır.
 
Form tabanlı kimlik denetiminde uygulamaya erişmek için kullanıcıların herhangi bir ağa üye olmalarına ihtiyaç yoktur.
Form tabanlı kimlik denetimi daha çok herkese açık internet uygulamalarında kullanılır.
Örneğin alış-veriş siteleri, içerik sağlayıcı portallar gibi sitelerde kullanılabilir.
 
Form Tabanlı Kimlik Denetiminin Etkinleştirilmesi
 
Form tabanlı kimlik denetimi programcıya kendi kullanıcı veritabanını oluşturma imkanı tanır. 
 
Adım Adım Etkinleştirme
 
1.       Web.config dosyasından kimlik denetim sistemi Forms olararak ayarlanır.
2.       Kullanıcı kimlik bilgilerinin (kullanıcı adı, şifre) girileceği bir Web Form oluşturulur.
3.       Kullanıcı kimlik bilgilerinin saklanması için isteğe seçime bağlı olarak programcının belirlediği parametreler 
çerçevesinde bir veritabanı oluşturulur veya Web.config dosyasında gerekli tanımlamalar yapılır.
4.       Oluşturulan Web Formuna kullanıcıların kimlik bilgilerinin denetlenmesi için gerekli kod yazılır.
Buradaki denetleme için yazılacak kod parçası kullanıcı listesinin özel bir veritabanında mı, yoksa Web.config dosyasında mı tutulduğuna göre değişir.
 
Windows tabanlı kimlik denetimi ile Form tabanlı kimlik denetimi arasındaki en büyük fark Form tabanlı kimlik denetiminde kimlik
denetleme işleminin programcı tarafından kod yazarak yapılmasıdır. Programcı bir Web Form oluşturup bu form ile kullanıcı bilgilerini alıp,
daha sonra bu bilgileri kullanıcı listesine bakarak denetleyerek kimlik denetim işlemini yapmak zorundadır.
Web.config Üzerindeki İşlemler
 
<authentication> düğümü ile kimlik denetim sistemi Forms olarak ayarlanır. Form tabanlı kimlik denetim sisteminin ayarlarının 
yapılması için <authentication> düğümü içerisinde <forms> düğümü açılmalıdır.
 
<authentication mode="Windows|Forms|Passport|None">
   <forms name="formismi"
          loginUrl="girissayfasiadresi" 
protection="All|None|Encryption|Validation"
          timeout="30" path="/"
          requireSSL="true|false"
          slidingExpiration="true|false">
      <credentials passwordFormat="Clear|SHA1|MD5">
         <user name="kullaniciadi" password="sifre"/>
      </credentials>
   </forms>
</authentication>
 
Yukarıdaki Web.config tanımlamasında Form tabanlı kimlik denetimi yapılırken kullanılan alt düğümler ve özellikler listelenmektedir. 
Aşağıdaki tabloda Form tabanlı kimlik denetimi uygulanırken kullanılması sözkonusu olan Web.config dosyası düğümleri ve özellikleri açıklanmaktadır.
 
<authentication>
§         mode: Kimlik denetim sistemini belirlemek için kullanılır. Forms değeri verilmelidir.
 
<forms>
§         name: Kimlik denetimi aşamasında oluşturulacak çerezin (cookie) ismini belirler. Varsayılan olarak .ASPXAUTH değerini taşır.
§         loginUrl: Kullanıcı kimlik anonim olarak istek yaptığı zaman görüntülenecek sayfayı belirler. 
Kullanıcı kimlik bilgilerinin (kullanıcı adı ve şifre) girilmesi için oluşturulan Web Formun ismi verilmelidir.
§         protection: Kullanıcı bilgisayarında saklanacak olan çerezin (cookie) güvenliğinin nasıl sağlanacağını belirler.
Alabileceği değerler All, Encryption, Validation, None. Varsayılan olarak All değerini alır.
All değeri ile çereze yazılacak verilerin güvenliği en iyi şekilde sağlanmaktadır.
§         timeout: Kimlik denetimi çerezlerinin kaç dakika geçerli olacağını belirler. Varsayılan değeri 30 dakikadır.
§         path: Oluşturulacak çerezlerin yol tanımlaması için kullanılır. Varsayılan değeri / dır.
§         requireSSL: Kimlik denetm çerezinin transferi için güvenli bağlantı gerekip gerekmediğini belirler.
§         slidingExpiration: Alabileceği değeler true ve false’ dur. true değerini aldığında kullanıcıdan gelen her istek ile 
zaman aşımı (timeout) süresi geri sayımı en baştan tekrar başlar. .NET Framework 1.0 da varsayılan değer true idi,
.NET Framework 1.1 versiyonunda varsayılan değer false’ dur.
<credentials>
§         passwordFormat : Kullanıcı şifrelerine uygulanan karakter şifreleme (encrypt) yöntemi belirlenir.
Alabileceği değerler SHA1, MD5 ve Clear’ dır. Varsayılan değer SHA1’ dir. Clear değeri verildiği takdirde şifreler açıkça yazılabilir.
 
<users>
§         name : Kullanıcının adını belirler.
§         password : Kullanıcının şifresini belirler. Belirlenen passwordFormat değeri ile uyumlu bir değer almalıdır.
 
<credentials> düğümü içerisine eklenen <user> düğümleri ile Web.config dosyası içerisinde kullanıcı tanımlaması yapılabilir. 
 
<credentials> düğümü kullanılarak kullanıcı kimlik bilgileri tanımlamak basit uygulamalar için kullanılabilir.
Bu şekilde bir uygulamada programcı yada bir yönetici tarafından Web.config dosyasına ekleme yapılmasıyla çalışabilir.
Fakat kullanıcıların kendi kullanıcı hesaplarını oluşturabileceği ve kimlik bilgilerinin yönetimini kendileri yapabileceği bir uygulama için kullanılamaz.
 
Kullanıcıların kendi kullanıcı hesaplarını oluşturabileceği, şifresini değiştirmek gibi hesap yönetim işlemlerini yapabileceği bir
uygulama hazırlanacağı zaman kullanıcı listesi programcının hazırlayacağı bir veritabanından saklanmalıdır.
Bu veritabanı için bir Access veritabanı dosyası, XML dosyası, SQL Server veya başka herhangi bir veritabanı kullanılabilir.
Bu  uygulama ölçeğine göre programcı tarafından belirlenmelidir. .NET ile hazırlanan uygulamlarda genellikle veritabanı olarak SQL Server kullanımı tercih edilmektedir.
 
Kullanıcı Girişini Yapmak
 
Form tabanlı kimlik denetiminde kullanıcının girişi yapması için bir Web Form oluşturulmalıdır. Bu Web Formu ile kullanıcıdan kimlike bilgileri alınıp denetlenir. 
 
Kullanıcı Adı:<asp:TextBox id="txtKullanici"
runat="server"></asp:TextBox><BR>
 
Şifre:<asp:TextBox id="txtSifre" runat="server"
TextMode="Password"></asp:TextBox><BR>
 
<asp:CheckBox id="chkHatirla" runat="server"
Text="Bu bilgisayarda hatırla"></asp:CheckBox><BR>
 
<asp:Button id="btnGirisYap" runat="server"
Text="Giriş Yap"></asp:Button><BR>
 
<asp:Label id="lblMsg" runat="server"></asp:Label>
 
Yukarıdaki şekilde bir Web Form oluşturulmuştur bu form ile kullanıcının kimlik bilgilerini girecek ve kimlik bilgilerini denetleterek yetkilendirilecek.

 

Web.config Dosyasındaki Kullanıcı Listesi ile Kullanıcı Girişi Yapmak
 
Web.config dosyasında kullanıcı listesi <credentials> düğümü içerisine eklenen <user> düğümleri ile oluşturulur. 
 
Aşağıda kullanıcı listesi Web.config dosyasında tanımalacak bir uygulamanın kimlik denetimi ile ilgili bölümleri gözükmektedir.
 
<authentication mode="Forms">
     <forms loginUrl="UyeGirisi.aspx">
          <credentials passwordFormat="Clear">
               <user name="cengiz" password="han"></user>
               <user name="kadir" password="sumerkent"></user>
          </credentials>
     </forms>
</authentication>
<authorization>
     <deny users="?" />
</authorization>
 
Yukarıdaki örnek Web.config parçasında uygulamanın kimlik denetim sistemi Form tabanlı olarak belirlenmiştir
Kullanıcının kimlik bilgilerini ile giriş yapması gereken sayfa olarak UyeGirisi.aspx dosyası belirlenmiştir.
Kullanıcıların listesi ise web.config dosyasında <credentials> düğümü içerisinde belirlenmiştir.
Ayrıca anonim erişimi engellemek için <authorization> düğümü içerisinde <deny> düğümü ile gerekli ayar yapılmıştır.
Anonim olarak uygulamaya istekde bulunan kullanıcı daha önce yukarıda oluşturulan UyeGirisi.aspx sayfasına yönlendirilecektir.
 Bu sayfada btnGirisYap ismindeki butona basıldığı zaman bilgilerin denetlenmesi için aşağıdaki kod bloğuna benzer yapıda bir kod bloğu kullanılabilir.
 
 
If FormsAuthentication.Authenticate _
(txtKullanici.Text, txtSifre.Text) Then
     FormsAuthentication.RedirectFromLoginPage _
     (txtKullanici.Text, chkHatirla.Checked)
Else
     lblMsg.Text = "Kullanıcı adı ve/veya şifre yanlış."
End If

 

Yukarıdaki kod parçasında FormsAuthentication sınıfının Shared fonksiyonu olan Authenticate fonksiyonu ile kullanıcı adı ve şifre kontrolü yapılır.
 Bu fonksiyon geriye boolean tipinde değer döner. Eğer verilen kullanıcı adı ve şifre doğru ise geriye true değerini döndürür.
 
[Visual Basic]
Public Shared Function Authenticate( _
   ByVal name As String, _
   ByVal password As String _
) As Boolean
 
Yukarıda Authenticate fonksiyonun temsili gözükmektedir.
 
Yukarıdaki kod parçasında FormsAuthentication sınıfının Shared fonksiyonu olan RedirectFromLoginPage fonksiyonu kimlik denetiminden 
başarılı bir şekilde geçen kullanıcıyı geldiği sayfaya geri gönderir. 
 
Birinci parametre (userName) olarak kullanıcının adını alır. userName parametresinin tüm kullanıcı kayıtları arasında tekrarı olmayan bir değer 
alması uygulamanın diğer bölümlerinde kolaylık sağlayacaktır. 
 
İkinci parametre (createPersistentCookie) olarak ise kullanıcının bilgisayarına çerez bırakılıp bırakılmayacağını belirleyen boolean bir değer istiyor. 
Eğer true değeri verilir ise kullanıcı ayrıca çıkış yapmadıysa kendi bilgisayarında sadece bir defa giriş yapacak ve bundan sonra siteyi her ziyaret 
ettiğinde otomatik olarak giriş yapacaktır. 
 
 
RedirectFromLoginPage fonksiyonu iki adet overload versiyon içermektedir. Bunlardan ikincisi diğerine ek olarak üçüncü bir parametre istemektedir.
 Diğer iki parametre aynıdır. Bu üçüncü parametre (strCookiePath) çerezin uygulamada geçerli olacağı yolu belirler. 
 
Overloads Public Shared Sub RedirectFromLoginPage( _
   ByVal userName As String, _
   ByVal createPersistentCookie As Boolean _
)
 
Overloads Public Shared Sub RedirectFromLoginPage( _
   ByVal userName As String, _
   ByVal createPersistentCookie As Boolean, _
   ByVal strCookiePath As String _
)
 
Yukarıda RedirectFromLoginPage fonksiyonunun temsili gözükmektedir.
 

Kimlik denetimi ile sınıf kütüphanelerine erişmek için kod sayfasına System.Web.Security aduzayı dahil edilmelidir.

Veritabanında Kayıtlı Olan Kullanıcı Listesi ile Kullanıcı Girişi Yapmak
 
Kullanıcıların kendi kullanıcı hesaplarını oluşturabileceği, şifresini değiştirmek gibi hesap yönetim işlemlerini yapabileceği bir uygulama hazırlanacağı
zaman kullanıcı listesi programcının hazırlayacağı bir veritabanından saklanmalıdır. 
 
Programcı kullanıcı bilgilerini kendi hazırladığı özel veritabanında saklayarak kullanıcı ile ilgili daha fazla bilgiyi daha işlevsel ve kolay biçimde saklayabilir. 
 
Veritabanı destekli Form tabanlı kimlik denetim sistemi portal, alış veriş sitesi gibi kişisel bilgiler içeren uygulamalarda kullanılır.
 
Uygulamaya kullanıcının kendi kendine üye olabilmesi ve bilgilerini düzenleyebilmesi için Web Formları düzenlenmelidir.
 
Örneğin kullanıcı bilgileri SQL Server veritabanı sunucusunda saklanan bir web uygulamasında denetleme işlemleri için ADO.NET kullanılır.
 
Form tabanlı kimlik denetiini veritabanı bağlantılı biçimde uygularken Web.config dosyasında <credentials> düğümünün kullanılmasına gerek yoktur.
Bu düğüm sadece FormsAuthentication.Authenticate fonksiyonu tarafından kullanılır.
Veritabanı ile bağlantılı çalışmak için Web.config dosyasında kimlik denetimi ile ilgili düğümler aşağıdaki gibi düzenlenmelidir.
 
<authentication mode="Forms">
     <forms loginUrl="UyeGirisi.aspx" />
</authentication>
<authorization>
     <deny users="?" />
</authorization>
 
Daha önce yapılan UyeGirisi.aspx Web Formunu veritabanı bağlantılı şekilde kullanmak için btnGirisYap butonunun tıklanması olayına
 yazılan program kodunu aşağıdakine benzer şekilde değiştirmek gerekir. 
 
KimlikDenetle ismindeki fonksiyonun veritabanına bağlanıp kullanıcı bilgilerini denetlediği ve buna göre boolean bir sonuç döndüğü varsayılmaktadır.
 
 
If KimlikDenetle(txtKullanici.Text, txtSifre.Text) Then
               FormsAuthentication.RedirectFromLoginPage _
               (txtKullanici.Text, chkHatirla.Checked)
Else
               lblMsg.Text = "Kullanıcı adı ve/veya şifre yanlış."
End If
 
Yukarıdaki kod parçasında KimlikDenetle yardımcı fonksiyonu ile kullanıcı kimlik bilgisi denetleniyor.

 

KimlikDenetle Fonksiyonu
 
KimlikDenetle fonksiyonunun içeriği burada gösterilmemiş ve anlatılmamıştır. SQL Server veritabanı sunucusuna bağlanıp veri çekmek
 ile ilgili örnekler ADO.NET bölümünde anlatılmıştır. Buradaki KimlikDenetle fonksiyonu her durumda True değerini dönmektedir.
 
Function KimlikDenetle(ByVal kullanici As String, ByVal sifre As String) As Boolean
               veritabanı kontrol işlemlerini yap
               eğer kimlik geçerli ise 
                  return true
               aksi halde
                  return false
               Return True ‘her koşulda giriş yap
End Function
Kullanıcıyı Uygulamadan Çıkarmak
 
Kullanıcının işi bittiği zaman oturum (session) çerezlerini (cookie) ve eğer var ise kalıcı çerezleri (cookie) kaldırıp uygulamadan çıkması sağlanabilir.
 
Kullanıcının çıkışını sağlamak için SignOut metodu kullanılır.
 
Kullanıcnın sistemden çıkışını sağlayan kod parçası aşağıda gözükmektedir.
 

FormsAuthentication.SignOut()

Response.Redirect(Request.RawUrl)
[Visual Basic]
 
Yukarıdaki kod parçasında birinci satırda oturum çerezleri ve kalıcı çerezler kaldırılır. 
İkinci satırda ise sonucun sayfaya yansıması için şu anda bulunulan sayfa tekrar çağrılır.
 
 
Alt Klasörlere Erişim İznini Ayarlamak

 

Web.config dosyasındaki <authorization> düğümü ile belirlenen yetkiler hiyerarşik olarak tüm alt klasörler için geçerlidir.
 Fakat farklı istekler olabilir, örneğin uygulamanın ana klasörüne herkesin erişebilmesini fakat bir alt klasöre erişimin farklı yetkiler ile sağlanması istenebilir. 
 
Alt klasöre farklı bir erişim yetkisi vermek için alt klasör içerisinde de bir Web.config dosyası oluşturulur ve <authorization> düğümü ile yeni yetkilendirmeler tanımlanabilir.
 
Ayrıca ana dizindeki sadece Web.config dosyası ile farklı dosya ve alt klasörler için yetkilendirme yapılabilir.
Bunun için <configuration> düğümü içerisindeki <location> düğümü kullanılır. Bu düğüm ile işaret edilen dosya ve alt klasör için
sanki yeni bir Web.config tanımlarmış gibi yetkilendirme yapılabilir.
 
<location> düğümü ve alt klasör için yeni bir Web.config oluşturunca sadece güvenlik ayarları değil hemen hemen diğer tüm ayarlar belirlenebilir.
 
Örneğin yonetim alt klasörüne sadece CengizHan ve KadirSumerkent isimleriyle giriş yapanların erişebilmesi için aşağıdaki tanımlamalar yapılmalıdır.
Ana klasördeki Web.config dosyasından <location> düğümü ile
 
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<!-- buraya diğer düğümler eklenebilir -->
<location path="yonetim">
     <system.web>
          <authorization>
               <allow users="CengizHan" />
               <allow users="KadirSumerkent" />
               <deny users="*" />
          </authorization>
     </system.web>
</location>
<!-- buraya diğer düğümler eklenebilir -->
</configuration>
 
Yönetim klasöründeki Web.config dosyası ile
 
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
     <!-- buraya diğer düğümler eklenebilir -->
     <authorization>
          <allow users="CengizHan"></allow>
          <allow users="KadirSumerkent"></allow>
          <deny users="*" />
     </authorization>
     <!-- buraya diğer düğümler eklenebilir -->
</system.web>
</configuration>
 
<location> düğümü ile sadece alt klasörler için değil dosyalar içinde ayrı yetkilendirme yapılabilir.

 

Örneğin Siparislerim.aspx dosyasına anonim erişim yapılmaması için aşağıdaki tanımlamanın Siparislerim.aspx dosyası ile aynı klasörde bulunan
Web.config dosyasına yazılması gerekir.
 
<location path="Siparislerim.aspx">
     <system.web>
          <authorization>
               <deny users="?" />
          </authorization>
     </system.web>
</location>
 

Not:
Web uygulamasının kimlik denetim sistemi (Windows,Forms veya Passport) sadece ana klasörde bulunan Web.Config dosyası ile değiştirilebilir.
Uygulamanın alt klasörlerinden birisinde farklı bir kimlik denetim sistemi tanımlanmak istendiğinde ana projenin altında yer alacak şekilde yeni bir proje açıp kimlik denetim sistemini alt projenin ana klasöründeki Web.config dosyası ile belirlenir.
 

 

Cengiz HAN
Microsoft ASP.NET MVP
msn (ve email) : cengiz@cengizhan.com
e-mail : cengizh@yazgelistir.com