Dynamic Role Based Security

Peter Bromberg'in FormsAuthentication, Identities and Role - based Security with a database isimli makalesinde role tabanlı güvenliği nasıl sağlayacağımızı bir güzel anlatmış.

Kullanıcı giriş yaptıktan sonra herhangi bir işlem için User.IsInRole metodu ile yetkisini sınayabiliyoruz. 

if (User.IsInRole("Administrator")) 
{
    // bir şeyler yap
}
else
{
    // yetkin yok
}

Buda bir noktadan sonra güvenliği "code based" hale getiriyor ve yetki denetimi yapacağımız yerlerde bu if ifadesini eklememiz anlamına geliyor. Açıkça bu tür bir yetki denetimi benim pek hoşuma gitmiyor. İlgili işleme birde Supervizor'un yetki si eklendiğinde if satırımızı şu hale getirmemiz gerekecek :  

if ( 
User.IsInRole("Administrator") == true
||
User.IsInRole("Supervizor") == true
)

 Yeni bir rol eklendiğinde if satırımızda değişiklik yapmak gerecek.

Bu yetki denetimini olabildiğinde kod dışınadn tutmanın diğer bir yolu ise yetkileri web.config'ten belirlemek.

<configuration>
    
   ....


  <location path="Admin">
    <system.web>
      <authorization>
        <allow roles="Admin,Supervizor" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>     

</configuration>

Artık User.InRole mümkün mertebe daha az kullanılır hale getirdik. Peki, başlıkta da belirttiğinmiz gibi rollerimiz dinamik ise ? Yeni eklenen rol ü web.config e elimizel mi ekleyeceğiz ?

"Dynamic web.config" diye kısa bir google sorgulamasında güzel kaynaklara ulaşıyoruz. Yine Peter Bromberg abimizin Runtime Web.config / App.config Editing başlıklı güzel bir makalesine rastlıyoruz. Ancak benzer çoğu makale AppSetting ve ConnectionString üzerine odaklanmış.

Burdan hareketle kendi çözümümüzü üretmeye başlıyoruz.

Tam olarak yapmak istediğiniz 

<allow roles="Admin,Supervizor" />

satırına yeni bir role eklemek.

Web.config te nihayetinde bir XML belgesidir deyip Xpath ide yanımıza alıp System.XML in kapısını çalıyoruz.   

string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string path = System.IO.Path.Combine(baseDirectory, "Web.Config");
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlElement configuration = doc.DocumentElement;
XmlNode location = configuration.SelectSingleNode("location[@path='Admin']");
XmlNode allow = location.SelectSingleNode(@"system.web/authorization/allow");
allow.Attributes["roles"].InnerText += ",Ahmet";
doc.Save(path);
Uyarı : Web.config te yapılan her değişiklik IIS te Application'ı resetler. Bu kod çalıştıktan sonra Session larınız düşebilir. Üye girişinde cookie kullanmıyorsanız tüm kullanıcılar tekrar giriş yapmak zorunda kalabilir.
Published Tuesday, March 27, 2007 4:22 AM by Selçuk Yavuz
Filed under: ,

Comments

# re: Dynamic Role Based Security

Bu yazıdaki Ahmet ben oluyorum :p ...

Thursday, May 08, 2008 11:26 AM by ahmet fırat

Leave a Comment

(required) 
(required) 
(optional)
(required)