Makale Özeti

Uygulamalarınızda sadece sisteme giriş yapmış olan kullanıcılar ve giriş yapmamış olan kullanıclardan öteye geçerek kullanıcı için önceden tanımlı olan yetkilendirmelere göre bir kaynağa erişebilmesini, erişememesini veya dahil olduğu rolün yetkilerine bağlı olarak sayfaların farklı içerikler ile görüntülenmesine gerçek hayatta sıkça rastlarsınız.

Makale

Forms Authentication - Rol tabanlı güvenlik sistemi

 Yazdığımız web uygulamasında her isteyenin görmesini istemediğimiz bölümler olabilir. Örneğin üyelik sistemi ile çalışan bir uygulamanın yönetim sayfası gibi.

Asp.Net bize bazı güvenlik seçenekleri sunmaktadır.Forms Authentication,  Windows Authentication, Passport Authentication.

Authentication yöntemlerini daha önceki makalelerimde incelemiştim.
ASP.NET Web Uygulamalarının Güvenliği-1
ASP.NET Web Uygulamalarının Güvenliği-2
ASP.NET Web Uygulamalarının Güvenliği-3

Windows Authentication ile rol tabanlı güvenlik sistemi oluşturmak için ekstra olarak bir işlem yapmaya gerek yoktur. Kullanıcılar zaten bazı gruplara dahil olarak ASP.NET katmanına gelirler.

Ancak bu durum Forms Authenticaiton için aynı değildir. Zira Forms Authentication'da tüm yapılandırma ve yetkilendirme kendi kurduğumuz bir kullanıcı veritabanına bağlıdır.

Forms Authentication ile rol tabanlı yetkilendirme uygulaması için bir örnek:

 

Login.aspx’i yaptıktan sonra,

 

Global.asax.vb ye aşağıdaki kodu ekleyin.

 

   Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)

        If Not User Is Nothing AndAlso User.Identity.IsAuthenticated = True Then

            Dim roller() As String = UyeRoller.GetRoles(User.Identity.Name)

            HttpContext.Current.User = New GenericPrincipal(User.Identity, roller)

        End If

    End Sub

 

UyeRoller.GetRoles UyeID ye göre bir string dizisi olarak rolleri dönmektedir.

 

Imports System.Data.SqlClient

Public Class UyeRoller

    Public Shared Function GetRoles(ByVal uyeid As Integer) As String()

        Dim liste As New ArrayList

        Dim con As New SqlConnection("server=.;database=Uyelik;user id=sa;password=;")

        Dim cmd As New SqlCommand("", con)

        cmd.CommandText = "SELECT RoleName from roles where roleID IN (select roleID from uyerole where uyeID=@UyeID)"

        cmd.Parameters.Add("@UyeID", uyeid)

        con.Open()

        Dim rdr As SqlDataReader

        rdr = cmd.ExecuteReader

        While rdr.Read

            liste.Add(rdr("RoleName"))

        End While

        con.Close()

        Return liste.ToArray(GetType(System.String))

    End Function

End Class

 

Not: GetRoles metodu için bir caching sistemi kullanılarak her istekte veritabanına gitmesi engellenebilir.

 

Bu noktada sisteme giriş yapmış olan kullanıcının rolleri öğrenilmiş ve sistemde rolleri tanınır bir biçimde gezmesi sağlanmıştır.

Artık Web.config dosyasından istediğimiz rollere yetki yada kısıt tanımlayarak hangi rolün hangi kaynaklara erişebileceğini belirleyebiliriz.

 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

      <location path="Yazar.aspx">

            <system.web>

                  <authorization>

                        <allow roles="Admin"></allow>

                        <allow roles="Editor"></allow>

                        <allow roles="Yazar"></allow>

                        <deny users="*"></deny>

                  </authorization>

            </system.web>

      </location>

      <location path="Editor.aspx">

            <system.web>

                  <authorization>

                        <allow roles="Admin"></allow>

                        <allow roles="Editor"></allow>

                        <deny users="*"></deny>

                  </authorization>

            </system.web>

      </location>

      <location path="Admin.aspx">

            <system.web>

                  <authorization>

                        <allow roles="Admin"></allow>

                        <deny users="*"></deny>

                  </authorization>

            </system.web>

      </location>

 

.................

.................

.................

 

</configuration>

 

Yazar.aspx: Sadece Admin,Editor,Yazar rolleri erişebilir.

Editor.aspx: Sadece Admin,Editor rolleri erişebilir.

Admin.aspx: Sadece Admin rolü erişebilir.

 

Burada bir web sayfasını hangi rollerin görebileceğini belirledik. Bazı durumlarda “bu sayfayı sadece Admin rolündekiler görsün” demek yerine “bu sayfayı herkes görsün, ama Admin geldiği zaman Haberler in yanında Sil ve Düzenle butonları görüntülensin” dememiz gerekebilir. Yani kullanıcının dahil olduğu role göre içerik üretmemiz gerekebilir. Bu durumda yapmamız gereken ise sayfayı web.config ile kıstılamadan kod ile sayfanın içeriğini belirlemektir. Örneğin:

 

 

Bir ASP.NET WebForm’da aşağıdaki kodu yazdığımızda kullanıcının dahil olduğu role göre Label1.Text değişecektir.

 

 

 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        If User.IsInRole("Admin") Then

            Label1.Text = "admin olarak sayfayı görebilirsiniz."

        Else

            Label1.Text = "admin değilsiniz."

        End If

    End Sub

  

 

Sonuç

Uygulamalarınızda sadece sisteme giriş yapmış olan kullanıcılar ve giriş yapmamış olan kullanıclardan öteye geçerek kullanıcı için önceden tanımlı olan yetkilendirmelere göre bir kaynağa erişebilmesini, erişememesini veya dahil olduğu rolün yetkilerine bağlı olarak sayfaların farklı içerikler ile görüntülenmesine gerçek hayatta sıkça rastlarsınız. Bu makalenin ile kendi uygulamalarınıza rol tabanlı güvenlik sistemi kazandırabilirsiniz.

 

 

Cengiz HAN
Microsoft ASP.NET MVP
cengiz@cengizhan.com