Ocak
5th 2008
ASP.NET’te Rol Tabanlı(Rol-Based) Güvenlik

Posted under ASP

Rol tabanlı güvenliğin ASPNET’te nasıl uygulandığına geçmeden önce rolün ne olduğu ve uygulamalar içerisinde nasıl bir önem taşıdığı incelenmelidir. Bu tür bir inceleme için bir forum sitesi iyi bir örnek olarak verilebilir. Bir forum sitesini kullanan kullanıcıların aşağıdaki gibi rolleri olabilmektedir.

1) Sistem Yöneticisi, ekleme, silme güncelleme gibi işlemlerin hepsini yapabilen en yetkili kullanıcıdır.

2) �Moderator�, sadece gelen mesajları onaylayabilir

3) �Abone�, yeni mesaj yaratabilir, mesajları okuyabilir, yönetici özelliklerini barındırmaz.

4) Diğer (genel Internet kullanıcıları), sadece mesajları okuyabilirler.

ASP ile geliştirilen uygulamalarda genel yaklaşım kullanıcıyı diğerlerinden ayırt eden kimlik bilgisinin (�userid�) �Session� nesnesinde saklanması ve ilgili kullanıcının yetki bilgisinin veritabanından sorgu ile alınmasıdır.

int currentUserID = Session(”UserID”)

string userType = myDatabaseLookupFunction( currentUserID )

//Sadece System Administrator’ları ve Moderatörlerine izin var.

switch(userType)
{
case “1″:
case “2″ :
// Geçerli kullanıcı
case Else :
// Yetkisiz Kullancı
}


Bu tarz kod parçaları yetki kontrolünün yapılmasını gerektiren her sayfada yer almakta ve her defasında veritabanına bir sorgu gönderip sonuç almaya sebep olmaktadır.

ASP.NET teknolojisi ile bu yaklaşım değişmektedir.

Temeller (�Principals�), Roller ve Kimlikler

�Windows� işletim sistemlerinde kullanıcılar ve kullanıcıların bağlı bulunduğu grup tanımlamaları bulunmaktadır. Örneğin, güvenli bir ağa erişmek isteyen istemci, bir kullanıcı adı ile bu kullanıcı adının bağlı bulunduğu bir yada daha fazla grup bilgisine ihtiyaç duymaktadır. .NET terminolojisinde, kullanıcı adı ve grup kavramları kimlik ve rol olarak isimlendirilmektedir. Kodsal açıdan bakılırsa, kimlik ve rol bilgileri �Principal� isimli nesne içerisinde saklanmaktadır. Rol tabanlı güvenliğin nasıl sağlandığının daha iyi anlaşılabilmesi için, öncelikle bu üç kavramın birbirleri ile olan ilişkileri incelenmelidir. Kodlama örnekleri ilerleyen başlıklar altında verilecektir.

Kimlikler

Kimlikler kullanıcıları temsil etmektedirler. �System.Security.Principal� isim alanı altında bulunan, kullanıcı özelliklerinin tanımlanmasını sağlayan �WindowsIdentity� ve �GenericIdentity� sınıflarının yardımı ile gerekli kodlamalar yapılabilmektedir.

Roller

Kodlamada en basit şekilde metin dizini olarak yaratılıp �Principal� nesnesine eklenirler.

string[] roleString = {”manager”, “cleaner”}

�Principals�

Bir �Principal� nesnesi anlık kullanıcının kimlik ve rol bilgilerini taşımaktadır. Bu nesne �System.Security.Principal� �namespace� i altında yer alan �WindowsPrincipal� ve �GenericPrincipal� sınıfları kullanılarak yaratılmaktadır.

.NET ortamında çalışma zamanında, yetki kontrolünün gerektiği durumlarda, kullanıcı kimlik ve rol bilgilerini taşıyan �Principal� nesnesine ihtiyaç duyulmaktadır. Bu sebepten dolayı �authentication� işlemi sırasında gerçekliği doğrulanmış olan kullanıcı ve onun rol bilgileri �Principal� nesnesine atanmalıdır.

Kod Örneği

Aşağıdaki kod global.asax dosyası içerisine yazılmalıdır;

public void Application_AuthenticateRequest(object sender, EventArgs e)
{

System.Web.Security.FormsIdentity id;

id = HttpContext.Current.User.Identity;

string[] MyRoles = new string[2];

MyRoles[0] = “Manager”;

MyRoles[1] = “Admin”;

HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,MyRoles)
}

Yukarıdaki kod parçasında, önceden belirlenmiş rol tanımları ve kimlik bilgileri �authentication� işlemini gerçekleştiren kullanıcı için �Principal� nesnesine atanmaktadır.

�FormsAuthentication� nesnesinin çalışma mantığı hatırlanırsa, bir kullanıcının gerçekliği kanıtlanmakta (�authentication�) ve bir cookie yaratılmaktadır. �Application_AuthenticateRequest� metoduda bu sırada sistem tarafından çağırılmaktadır. Bu yüzden, kullanıcıya dinamik olarak rol ataması için bu metot uygun bir yerdir.

Özet

1) Kullanıcı adı ve şifresi kontrol edilir,

2) Kullanıcı için tanımlı olan roller çekilir,(VB.NET Kodu)

        Dim strRoles() As String
        Dim arrRoles As New ArrayList()
        ‘ do some database call that returns a reader
        While reader.Read()
                arrRoles.Add(reader(”role”))
        End While
        strRoles = arrRoles.ToArray(GetType(String), String()) 

3) Kimlik ve rol bilgileri �Principal� nesnesine atanır,

Dim objPrincipal As GenericPrincipal = New GenericPrincipal(objIdentity, strRoles)

4) HttpContext.Current.User= objPrincipal

Kullanıcı Rolü Kontrolleri

Uygulama içerisinde �Principal� nesnesinin içeriğine erişmek için dört ayrı yöntem bulunmaktadır. Bu yöntemler �Configuratively�, �Programmatically�, �Imperatively� ve �Declaratively� olarak isimlendirilmektedir. Burada ilk iki yöntem anlatılmaktadır.

Konfigürasyon Yöntemi(Configuratively)

Gerekli yetki kontrolü web.config dosyasında tanımlanmaktadır. Örneğin geliştirilen bir uygulamada, yönetim ile ilgili sayfalara sadece yönetici ve �moderator� tanımlı kullanıcıların erişmesi gerekmektedir. Bu durumu geçerli kılmak için aşağıda gösterildiği gibi bir kodlama yapılabilmektedir.

<authorization>
  <deny users=”*” />
  <allow roles=”SysAdmin, Moderator” />
</authorization> 

Bu yöntemin klasik ASP güvenlik yaklaşımı ile kıyaslandığında, yazılım geliştirenin işini kolaylaştırdığı görülmektedir. ASP teknolojisinde, güvenlik kontrolünün gerektiği her sayfaya ilgili kontrol kodları eklenmektedir.

Programsal Olarak(Programmatically)

Kod içerisinden yetki kontrolü yapmakta mümkündür. Örneğin, bir forum sitesinde genel Internet kullanıcılarının yazılanları okuması ancak yeni bir konu yaratamaması istenmektedir. Dolayısıyla yeni konu isimli köprü bu tip kullanıcılara gösterilmeyecektir.

if(!User.IsInRole(”public”))
    // göster
else

   // gösterme

Trackback URI | Comments RSS

Leave a Reply