Makale Özeti

Makale serimizin bu son makalesinde Rol yönetimi kavaramını detayları ile ele alıyor ve makale serimizi sonlandırıyoruz.

Makale

Rol Yönetimi

Makalenin şu ana kadar olan bölümünde kullanıcıların sisteme giriş yapmaları ile ilgili bilgiler yer aldı ancak sisteme giriş yapan kullanıcıların sistemin içinde neler yapabileceği gibi işlemler açıklanmadı. Daha önceki makalelerden de hatırlanacağı üzere bir kullanıcının sisteme kabul edilmesi olayına Authentication, sistem içindeki davranışlarının kontrol edilmesine de Authorization denilmekteydi. Aşağıdaki resim incelendiğinde Authentication ve Authorization kavramlarını daha iyi anlaşılabilecektir.

Resim incelendiğinde kullanıcı siteye girebiliyor ama site içerisinde yapabileceği işler oklarla belirlenmiş bulunmaktadır. Kullanıcı site içerisine giriş yapabildiği halde admin.aspx ve urunEkle.aspx sayfalarına giriş yapamamaktadır. ASP.NET'te bu işlem Rol yönetimi olarak adlandırılmıştır.

Yandaki resimde ASP.NET 2.0 Rol yönetim şemasını görmektesiniz. Şemada kontroller bölümünde her ne kadar bir kaç kontrol bulunsa da ne yazık ki Rol yönetimi için sürüklenip bırakılabilecek hazır kontroller bulunmamaktadır. Bu kontroller daha önce de bahsedilen Membership kontrolleridir ama tabi ki Rol yönetimi kullanılan yerlerde kullanılabilmektedir. Bir altta Rol yönetimini gerçekleştirmek için sınıfların bulunduğu API yer almaktadır. Veri tabanı katmanına erişmek için sınıflar ve SQL Server arasında SqlRoleProvider yer almaktadır. SQL Server katmanında ise Rollerin tutulabileceği tablolar, Viewlar ve veri giriş-çıkış işlemlerini gerçekleyecek olan yapılar yer almaktadır.

Sitede rol yönetim sisteme kullanmak için ilk olarak site de rollerin kullanımı aktif yapılmalıdır. Bu işlem için uygulama ayarlama dosyasında (web.config) aşağıdaki ayarlar yapılıyor olmalıdır.

 

 

<system.web>

........

<roleManager enabled="true" />

..........

</system.web>

Bu ayarlardan sonra web sitesi için rol yönetimi aktif hale gelecektir. Rol yönetimi için gerçekleştirilebilecek diğer ayarlar da aşağıdaki tabloda yer almaktadır.

Özellik Açıklama
enabled Site için rol yönetim servisinin aktif olup olmayacağı belirtiliyor.
cacheRolesInCookie Kullanıcının rollerinin istemcide bir cookie'de saklanılıp saklanmayacağı belirtiliyor.
cookieName İstemcide saklanacak olan cookie'nin adı belirtiliyor. Cookie'nin varsayılan adı .ASPXROLES olarak belirlenmiştir.
cookieTimeout İstemciye atılan Cookie'nin dakika cinsinden zaman aşımını belirliyor.
cookieRequireSSL Rol yönetimi bilgilerinin şifrelenerek gönderilmesini sağlıyor.
cookieSlidingExpiration Bu özellik Cookie'nin her istekten sonra TimeOut özelliğinde belirtilen zaman kadar veya varsayılan olan 30 dakikada sona erdirilmeyeceği olmayacağı belirtiliyor. Bu özellik varsayılan olaran True gelmektedir bu özellik False olarak ayarlandığında Cooki ilk istekten sonra belirtilen zamanda sona erdirilecektir.
createPersistentCookie Cookie'nin zamanla sonlanıp sonlanmayacağı belirtiliyor varsayılan değer güvenlik nedenleri ile False'tur.
cookieProtection Kullanıcının sistemine atılacak olan Cookie'nin korunma modu belirtiliyor. Burada mümkün olan toplam dört tane seçenek vardır. Bunlar:
All: Cookie hem data doğrulama hem de şifreleme algoritmaları ile korunur. Varsayılan mod budur.
None:Cookie'ye herhangi bir koruma algoritması kullanılmaz.
Encryption: Cookie şifreleme algoritması ile korunur ama veri doğrulama aktif değildir.
Validation: Veri doğruılama aktiftir ama şifreleme aktif değildir.
DefaultProvider Rol yönetim servisi için varsayılan olarak kullanılacak olan sağlayıcı belirleniyor, varsayılan değer AspNetSqlRoleProvider'dır.

Rol yönetimi için hazır kontroller olmadığından bahsedilmişti bu sebeple sistemde bulunacak rolleri belirlemek için aşağıdaki sayfa tasarlanıyor olsun.

Yukarıda sayfa tasarımı görülen bu sayfa sisteme yeni rol eklemek için kullanılacaktır. TextBox'ın içersinde belirtilen isimde bir rol Rol Ekle butonuna tıklanıldığında sisteme eklenecektir. Hemen altta bulunan ListBox'ın içerisinde ise sistemde var olan roller görüntüleniyor olacaktır. Button'ın click olayına yazılacak olan kodlar aşağıdaki gibi olmalıdır.

protected void Button1_Click(object sender, EventArgs e)

{

Roles.CreateRole(TextBox1.Text);//Bu satır sisteme yeni rol ekleyecektir.

ListBox1.DataSource = Roles.GetAllRoles();//Bu satır ile sistemde bulunan roller döndürülerek ListBox'a bağlanacaktır.

ListBox1.DataBind();

}

Yukarıdaki kodlar incelendiğinde yeni bir Rol eklemek için Roles sınıfının CreateRole metodu kullanılıyor. Sistemde bulunan rolleri elde etmek için de Roles sınıfının GetAllRoles metodu kullanılmaktadır. GetAllRoles metodu string türünden bir dizi döndürmektedir, dolayısı ile direkt DropDownList kontrolüne DataSource olarak gösterilebilmektedir. Yukarıdaki kodlar sisteme TextBox'ın Text özelliğinde belirtilen isimdeki rolü ekliyor ve ardından sayfada bulunan ListBox kontrolünde sistemde bulunan rolleri listeliyor. Aşağıdaki kodlar ise bu listeleme işlemini sayfanın Page_Load olayında gerçekleştiriliyor.

if (!Page.IsPostBack)

{

ListBox1.DataSource = Roles.GetAllRoles();

ListBox1.DataBind();

}

Bu işlemlerden sonra uygulamada kullanmak için yeni roller sisteme eklenebiliyor olacaktır. Eklenen rollerin silinmesi de istenilebilecek bir durumdur. Bu durumu gerçeklemek için de bir sayfa tasarlansın ve sayfada bir DropDownList ve bir Button kontrolü bulunsun. Sayfada yapılacak olan işlem çok basittir. DropDownList'te seçili olan rol Button'a basılınca silinecek ve DropDownList'in içeri yeniden doldurulacaktır. Bu işlemi gerçeklemek için tasarlanan sayfanın görünümü aşağıdaki gibidir.

Sayfaya veri getirmek için yazılacak olan kodlar aşağıda yer almaktadır.

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

DropDownList1.DataSource = Roles.GetAllRoles();

DropDownList1.DataBind();

}

}

Button'a tıklanıldığı zaman işletilip belirtilen rolü silecek olan kodlar da aşağıdaki gibidir.

protected void Button1_Click(object sender, EventArgs e)

{

Roles.DeleteRole(DropDownList1.SelectedItem.ToString());

DropDownList1.DataSource = Roles.GetAllRoles();

DropDownList1.DataBind();

}

Görüldüğü üzere veri silme işlemleri Roles sınıfının DeleteRole motodu ile gerçekleştirilmektedir. DeleteRole metodunun iki tane aşırı yüklenmiş yapılandırıcısı bulunmaktadır. Bunlardan ilki yukarıdaki örnekte kullanılan içerisine string türünden bir değer ile silinecek olan rolün adını alan metod diğer ise silinecek olan rolün adı ile birlikte bool türünden bir değer alan bir metod. İkinci metodun ikinci parametresi şu anlama gelmektedir,bu parametrenin amacı silinecek olan role kayıtlı üye olması durumunda ortama hata mesajı fırlatılmasını sağlamaktır.

Kullanıcıları Bir Role Dahil Etmek

Yukarıdaki kodlar ile sisteme rol ekledikten sonra sıra geldi bu role kullanıcı(ları) dahil etmeye. Roles sınıfında bu işlem için kullanılabilecek dört tane metod yer almaktadır. Bu metodlar açıklamaları ile birlikte aşağıdaki tabloda bulunmaktadır.

AddUserToRole Bir kullanıcıyı bir role dahil etmek için kullanılabilecek metod.
AddUserToRoles Bir kullanıcıyı birden fazla role dahil etmek için kullanılabilecek metod.
AddUsersToRole Birden fazla kullanıcıyı bir role dahil etmek için kullanılacak olan metod.
AddUsersToRoles Birden fazla kullanıcıyı birden fazla role dahil etmek için kullanılacak olan metod.

Bu metodların tümü kullanıcıları role dahil etmek için kullanılmaktadır. Birden fazla kullanıcı veya rol belirtilirken metodlar parametre olarak string türünden bir  dizi almaktadırlar. Bu durumu kullanmak için de yeni bir sayfa eklensin ve bu sayfa üzerinden bir kullanıcı bir role dahil ediliyor olsun. Sayfada iki tane DropDownList kontrolü yer alsın ve biri rolleri listelerken diğeri User'ları listeliyor olsun. DropDownList'lerin altında yer alacak olan Button'da seçilen kullanıcıyı seçilen role eklesin. Bahsedilen senaryoyu gerçeklemek için tasarlanan web sayfasının görünümü aşağıdaki gibi olacaktır.

Button'a tıklanılınca çalıştırılacak olan kodlar yazılmadan önce DropDownList kontrollerini doldurmak gerekmektedir. Bu sebeple ilk olarak yeni eklenen sayfanın PageLoad olayına aşağıdaki kodlar eklenmelidir. Kodlar daha önceki örneklerden tanıdık gelecektir.

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

DropDownListRol.DataSource = Roles.GetAllRoles();

DropDownListRol.DataBind();

DropDownListUserName.DataSource = Membership.GetAllUsers();

DropDownListUserName.DataBind();

}

}


Membership sınıfının GetAllUsers metodu sistemde bulunan tüm kullanıcıları getirecektir.

Button'a tıklanıldığında işletilecek olan kod aşağıda görüntülenmektedir.

protected void Button1_Click(object sender, EventArgs e)

{

Roles.AddUserToRole(DropDownListUserName.SelectedItem.ToString(), DropDownListRol.SelectedItem.ToString());

}

Rollere Dahil Edilen Kullanıcılar İle Çalışmak

Bir role dahil olan kullanıcıları elde etmek için gene Role sınıfı kullanılacaktır. Rollere dahil olan kullanıcıları elde etmek için Role sınıfının GetUsersInRole ve GetRolesForUser metodları kullanılabilir. GetUsersInRole metodu parametre olarak rol adını kabul eder ve geriye bu role dahil olan kullanıcıların kullanıcı adlarını bir string dizisi halinde döndürür. GetRolesForUser metodu ise benzer şekilde içerisine parametre olarak kullanıcı adı alır ve belirtilen kullanıcı adının dahil olduğu roller bir string dizisi halinde döndürülüyor. GetRolesForUser metodunun iki adet aşırı yüklenmiş yapılandırıcısı vardır bunlardan biri içine parametre olarak kullanıcı adını kabul ederken diğeri ise parametre kabul etmez ve sisteme giriş yapmış olan mevcut kullanıcının dahil olduğu rolleri döndürür.

Aşağıdaki örnek incelendiğinde bu iki metodun kullanımı daha iyi anlaşılabilecektir. Örneğin gerçeklemek için projeye bir tane sayfa ekleniyor olsun ve sayfanın PageLoad olayına aşağıdaki kodlar yazılsın.

protected void Page_Load(object sender, EventArgs e)

{

string[] kullanicilar=Roles.GetUsersInRole("Admin");

Response.Write("<b>Admin rolüne dahil olan kullanıcılar:</b> <br>");

foreach (string kullanici in kullanicilar)

{

Response.Write(kullanici+"<br>");

}

Response.Write("<b>BurakBatur isimli kullanıcının dahil olduğu roller: </b><br>");

string[] roller=Roles.GetRolesForUser("BurakBatur");

foreach (string rol in roller)

{

Response.Write(rol + "<br>");

}

}

Kodlar incelendiğinde ilk olarak Admin isimli role dahil olan tüm kullanıcıların listelendiği ve ikinci olarak alttaki bölümde de BurakBatur isimli kullanıcının dahil olduğu tüm rollerin listelendiği görülmektedir. Kodlar çalıştırıldığında aşağıdaki sonuca ulaşılıyor olacaktır.

Bir kullanıcının role dahil olup olmadığını kontrol etmek

Role sınıfının yazılım geliştiricilere sunduğu imkanlar sayesinde bir kullanıcının belirtilen role dahil olup olmadığı da Role sınıfı kullanılarak belirlenebiliyor. Bu işlem sayesinde farklı rol gruplarından gelen farklı kullanıcılara göre kod tarafında işlem yaptırılabilmektedir. Bir kullanıcının bir role dahil olup olmadığını belirten metod Roles sınıfı içerisinde yer alan IsUserInRole metodudur. Bu metodun toplam iki adet yapılandırıcı bulunmaktadır. Bunlardan ilki içerisine string türünden bir parametre ile rol adını alır ve o an oturum açmış olan kullanıcının belirtilen role dahil olup olmadığını bool türünden döndürür. İkinci yapılandırıcı ise ilk parametre olarak string türünden kullanıcı adını alır, ikinci parametre olarak gene string türünden rol adını alır ve belirtilen kullanıcının belirtilen rolde olup olmadığını kontrol ederek bool türünden bir sonuç döndürür.

LoginView Kontrolü

Daha önceki bölümlerde Membership ile birlikte gelen Login kontrollerinden bahsederken LoginView kontrolünden bahsedilmediği dikkatli okuyucuların gözünden kaçmamıştır diye tahmin ediyorum. Bu kontrol Membership tarafında kullanıcılara, kullanıcının Oturum açmış olup olmamasına göre faklı görünümler sunulmasına olanak tanımaktadır. Ancak işin içine bir de roller girdiğinde bu kontrol her role göre bile farklı görünümler sunulmasına olanak tanıyor. İlk olarak kontrolün özelliklerini daha sınırlı kullanarak sadece kullanıcının oturum durumunun gösteren bir örnekleme yapılsın. Bu işlem için sayfaya bir tane LoginView kontrolü sürüklenip bırakılıp Smart Tag'ine göz atıldığında Views bölümünde listelenen görünüm modlarında iki adet görünüm olduğu fark edilmelidir. Bunlardan biri Anonim kullanıcılara gösterilecek olan şablon ve diğeri de otum açmış olan kullanıcılara gösterilecek olan şablondur. Varsayılan olarak Anonim kullanıcılara gösterilecek olan AnonymousTemplate alanına Kullanıcılara anonim bir kullanıcı olduğunu belirten bir mesaj eklensin. Daha sonra Smart Tag üzerinden LoggedInTemplate bölümüne geçilip bu alana da kullanıcının oturum açtığını belirten bir mesaj eklensin. Bu işlemlerden sonra sayfanın kaynak tarafına geçildiğinde LoginView kontrolünün kodları aşağıdaki gibi oluşturuluş olacaktır.

<asp:LoginView ID="LoginView1" runat="server">

<AnonymousTemplate>

Şu anda anonim Kullanıcısınız...

</AnonymousTemplate>

<LoggedInTemplate>

Oturum Açtınız...

</LoggedInTemplate>

</asp:LoginView>

Sayfa ilk çalıştırıldığında anonim kullanıcı olarak bu sayfanın çalıştırıldığı bilgisi veriliyor olacaktır ancak oturum açıldıktan sonra LoginView kontrolünün bulunduğu sayfaya gelindiğinde oturum açmış bir kullanıcı olduğu kullanıcıya bildiriliyor olacaktır.

LoginView kontrolünün faklı rol gruplarına göre da farklı görünümlere bürünebileceğinden söz edilmişti. Bu işlem için görüntülenmesi istenilen her rol grubu için bir tanımlama yapmak gerekiyor. Bu işlemi VisualStudo 2005 üzerinden LoginView kontrolünün özelliklerinden RoleGroups kullanılabilir. Bu alanı kullanmak için üzerinde üç nokta bulunan elips button tıklanılmalıdır. Bu işlemden sonra aşağıdaki resimdeki gibi görülen yeni bir pencere açılacak ve bu alanda da rol grupları LoginView kontrolüne bildirilebilecektir.

Bu pencere yardımı ile istenilen rol grupları belirlenip Ok tuşuna basıldıktan sonra LoginView kontrolünün Smart Tag'ine yeniden göz atıldığında belirtilen rol gruplarının da burada yer alıyor olduğu görülecektir. Tıpkı diğer şablonlar gibi bu alanlara da Visual Studio üzerinden içerik eklenebilecektir. Admin rol grubu için ilgili alana Oturum Açtınız Şu anda Admin yetkisine sahipsiniz, Sınırlı alanı için de Oturum açtınız şu anda Sınırlı yetkisine sahipsiniz yazılsın. Bu değişiklikler de yapıldıktan sonra LoginView kontrolünün kodları aşağıdaki hali alacaktır.

<asp:LoginView ID="LoginView1" runat="server">

<AnonymousTemplate>

Şu anda anonim Kullanıcısınız...

</AnonymousTemplate>

<LoggedInTemplate>

Oturum Açtınız...

</LoggedInTemplate>

<RoleGroups>

<asp:RoleGroup Roles="Admin">

<ContentTemplate>

Oturum Açtınız: Şu anda Admin Yetkisine sahipsiniz...

</ContentTemplate>

</asp:RoleGroup>

<asp:RoleGroup Roles="Sınırlı">

<ContentTemplate>

Oturum Açtınız: Şu anda Sınırlı yetksine sahipsiniz...

</ContentTemplate>

</asp:RoleGroup>

</RoleGroups>

</asp:LoginView>

Bu değişiklikten sonra LoginView kontrolü artık sadece kullanıcının oturum açıp açmadığına göre değil kullanıcının üyesi olduğu rol grubuna göre de faklı içerik sunabiliyor olacaktır.

Yazılım geliştiriciler LoginView kontrolünün şablonlarının içine sadece text tabanlı veri eklemek ile sınırlı değillerdir. Eğer istenilirse bu alanlara herhangi bir ASP.NET Server kontrolü eklenebileceği gibi herhangi bir içerik de eklenebilir. Gerçek hayatta bu kontrol faklı rol grubundan kişilere faklı menüler görüntülemek için ASP.NET Navigation kontrolleri ile ya da istenilen bir menü ile kullanılabilir.

Bir Rol'den Kullanıcı Silmek

Bir role kullanıcı eklenebildiği gibi tabi ki silinedebilmektedir. Bir rolden veya rollerden kullanıcı(lar) silmek için toplam dört adet metod mevcuttur. Aşağıdaki tabloda bu metodalar ve açıklamaları yer almaktadır.

RemoveUserFromRole Bir rolden bir kullanıcıyı silmek için kullanılacak olan metod.
RemoveUserFromRoles Bir kullanıcıyı birden fazla rolden silmek için kullanılacak olan metod.
RemoveUsersFromRole Birden fazla kullanıcıyı bir rolden silmek için kullanılacak olan metod.
RemoveUsersFromRoles Birden fazla kullanıcıyı birden fazla rolden silmek için kullanılacak olan metod.

Bu metodlar incelendiğinde çoğul alanlar string türünden bir dizi isterken tekil alanlar ise string türünden bir değer kabul etmekte ve işlem yapmaktadır. Konunun daha iyi anlaşılabilmesi için bir örnek yapmak iyi olacaktır. Rol yönetiminin aktif olduğu bir projeye kullanıcıları bulundukları rolden silmek için kullanılacak olan bir sayfa eklensin. Sayfa ilk olarak rolleri listelemeli ardından da seçilen role dahil olan kullanıcıları listeliyor olmalı ve bir tane Sil Buttonu yardımı ile Seçilen kullanıcıyı seçilen rolden silip formu resetlemeli. Bu işlem için sayfaya bir tane DropDownList, bir tane ListBox ve iki tane de Button kontrolü sürükleyip bırakılsın kontroller sayfada aşağıdaki resimde görüldüğü gibi dizilmelidir.

Yapılması gereken işlemlerden ilki DropDownList kontrolüsü sistemde bulunan tüm rollerde doldurmak olmalıdır. Bu işlem için sayfanın PageLoad olayına aşağıdaki kodlar eklenmelidir. Ancak bu kodlar sayfa her PostBack olduğunda değil sayfa ilk defa çalıştığında çalışıyor olmalıdır bu yüzden kodlar if bloğu içerisinde yazılmaktadır.

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

DropDownListRol.DataSource = Roles.GetAllRoles();

DropDownListRol.DataBind();

}

}

Bu kodlar makalenin önceki bölümlerinden tanıdık geliyor olmalıdır. Roles sınıfının GetAllRoles metodu ile sistemde bulunan tüm roller string dizisi halinde elde edildi. Yapılacak olan ikinci işlem seçilen rol grubuna dahil olan kullanıcıları ListBox içerisinde listelemek olacaktır. Bu işlem içinde DropDownList kontrolünün yanında bulunan Button'un Click olayına aşağıdaki kodlar eklenmelidir.

protected void ButtonKullaniciGetir_Click(object sender, EventArgs e)

{

ListBoxKullanicilar.DataSource = Roles.GetUsersInRole(DropDownListRol.SelectedItem.ToString());

ListBoxKullanicilar.DataBind();

}

Bu kodlar GetUserInRole metodu ile DropDownList'te seçili olan rolde bulunan tüm kullanıcıları ListBox kontrolünde listeleyecektir. Sıra geldi üçüncü ve son işleme üzerinde Sil yazan Button'a tıklanıldığında ise seçili olan rolden seçili olan kullanıcı silinip ListBox'ın içerisi boşaltılarak DropDownList kontrolün seçili değeri de ilk değer olarak belirlenecektir. Bu işler için yazılan kodlar da aşağıda görüntülenmektedir.

protected void ButtonSil_Click(object sender, EventArgs e)

{

Roles.RemoveUserFromRole(ListBoxKullanicilar.SelectedItem.ToString(),DropDownListRol.SelectedItem.ToString());

ListBoxKullanicilar.Items.Clear();

DropDownListRol.SelectedIndex=0;

}

Kodlar incelendiğinde Roles sınıfının RemoveUserFromRole metodunun kullanıldığı görülecektir. Bu metod içine iki tane srting türünde parametre kabul eder. Bunlardan ilki kullanıcı adıdır ve ikincisi de rol adıdır. Bu metot belirtilen kullanıcıyı belirtilen rolden siler.

Bu makale serisinde toplam üç makalede ASP.NET 2.0'daki üyelik ve rol yönetimini ele aldık. Makalenin daha kolay okunabilirliği adına üç makale halinde yayınlamayı tercih ettik umarım işinize yarar. Bir sonraki makalede görüşmek dileğiyle hoşçakalın.

Burak Batur
www.burakbatur.com