|
ASP.NET'te Rol Tabanlı(Rol-Based) Güvenlik |
|
Gönderiliyor lütfen bekleyin... |
|
|
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.
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
KAYNAKLAR
1) Microsoft ASP.NET Professional Projects – Hersh Bhasin,
ISBN:1-931841-21-7
2) www.microsoft.com
3) www.4guysfromrolla.com
Makale:
ASP.NET'te Rol Tabanlı(Rol-Based) Güvenlik ASP.NET Serkan Üstündağ
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|