Makale Özeti

Microsoft'un son versiyonunu Haziran 2005'te piyasaya sürdüğü Enpterprise Libraray "çatı-yapı" sının 7 üyesinden biri olan Configuration Aplication Block yapısını inceleyeceğiz. Configuration Application Block'ta girilen konfigurasyon bilgilerini XML dosyasına yazıp, XML dosyasından okuyacağız. Ayrıca, Configuration Application Block'un configurasyon bilgilerinin nasıl korunacağını (encryption/decryption) da uygulamalı olarak beraber göreceğiz.

Makale

 Enterprise Library Configuration Application Block

 

Enterprise Library'nin Uygulama Bloklarını incelemeye devam ediyoruz. Bu bloklardan biri olan Configurasyon Application Block, Configurasyon bilgilerini ayarladığımız, girdiğimiz Uygulama Bloğudur  

Uygulama Configurasyonlari XML veya Windows.in'de Windows registry'de ya da database'de tutulabilir.  Her bir alternatifin güçlü ve zayıf yanları olmakla beraber Seçim uygulama geliştiricinin tercihine bağlı olarak değişir.

Enterprise Library Configurasyon Application Block, configirasyon datalariın okuyup storage providers'larla yazmamızı sağlar.Storage Providers'lar, XML ve/ya SQL database gibi belirli fiziksel veri depolarından bilgi okuyup, buralara veri yazmamızı sağlarlar.Transformer'lar, uygulamanın konfigurasyonunu okuyup, konfigürasyon bilgilerini storage providersların beklediği  formata dönüştürürler.Storage Provider'ler:

--XML File Storage Provider (Ocak 2005'te vardı)

--Application Configuration Storage Provider(Haziran 2005'te eklendi)

--- Registry Storage Provider, (Haziran 2005'te eklendi)

---SQL Storage Provider diye (Haziran 2005'te eklendi)

4 gruba ayrılırlar. Biz bugün XML File Storage Provider'ı inceleyeceğiz.

Storage provider'ları configurasyon metadatalarını içeren  file'larda tanımlarız.(Web.Config,App.Config veya Machine.Config) Metadata, configurasyon bölümünün adı, locasyonu ,configürasyon ayarlarını okuyup yazarken kullanacağımız objelerin type isimleri gibi bilgileri içerirler.Eğer configürasyon datasını enkripte etmek istersek, metadata encrypt ayarlarını da içerir.

 

Buradaki avantajlarımız, kodlarda herhangi bir değişiklik yapmadan, locasyon bilgilerini, store çeşidini değiştirebiliriz.

 

Öncelikle CoAB ismiyle bir Web Uygulamasını oluşturalım.Biz burada özetle aşağıdakileri seçegeğiz

Section Name: Ayarlar Bölümü

Storage Provider: XML File Storage Provider

File Name = "ayarlar.config" 

Transformer: XML Serializer Transformer 

1-Başlat-Tüm Programlar-Microsoft pattern &practices-Enterprise Library-June 2005-->Enpterprise Library Configuration'ı açalım. Oradan da, *

*uygulamamız Web Uygulaması ise Web.config'i

**uygulamaız Windows Uygulaması ise App.Config'i açalım. Uygulama adını  yazgelistirCoAB koyalım.

 

 

yazgelistirCoAB'ı sağ tıklayıp, New--> Confugutation Application Block'u seçelim.Configuration Application Block ve Encrytion Section eklenir.

 

 

 

 

 

Configuration Application Block-->New--Configuration Section ekleyelim

 

 

Configuration Section adini, kodda da kullanmak üzere, AyarlarBolumu yapalım.

 

Configurasyonu XML dosyasında saklayacağımız için, XML File Storage Provider'i ekleyelim.Bunun için

AyarlarBolumu>>New>>XML File Storage Provider'i seçelim.

 

 

XML dosyamizin adini Ayarlar.config koyalim.Bu add'la bir config dosyası işlemler bittiğinde projemize eklenir.

 

  

Xml Serializer Transformer kullanrak, XML olarak serialize edilmiş dataları yazıp, öyle dataları okuyabiliriz.Xml Serializer Transformer  objeleri XMLNode type seralize eder ve XMLNode objelerinide uygun objelere deserialize eder. Xml Serializer Transformer  eklemek için AyarlarBolumu>>New>> Xml Serializer Transformer'i seçeriz.( Eğer istersek XML Include Type ekleyebiliriz., bunun için de XML Serializer Transformer'i sağ tıklayıp>>New>>XML Include Type eklemeliyiz. Pek çok type ekleyebiliriz. Name bölününe istediğimiz ismi, sağ taraftaki panoda verebiliriz.Onun altında bulunan TypeName bölününe de, Type Selector'den uygun assebly'i seçerek gireriz. Ancak bugünkü uygulamada bu bölümle işimiz yok:=))

 

 

ekledikten sonra sol taraftaki panoda da görebiliriz.

 

Sonra da Kaydet düğmesine basalım. Bastıktan sonra eğer Web.config'e bakarsak yaptığımız ayarların Web.config'e yansıdığını görürüz.

 

Not: Eğer siz de benim gibi dalgınlıkla Xml Serializer Transformer 'i eklemezseniz, aşağıdaki hatayı alırsınız. Zaten hata tanımı da 

"Ben  Xml Serializer Transformer 'i istiyorum "diye bas bas bağırıyor:=)

 

 

Şimdi CoAB isimli projemize dönersek, Solution Explorer'dan  Show All Files'ı tıkarsak, ayarlar.config dosyamızı görürüz.

 

Şimdi de Configuration Application Block'u kullanabilmemiz için gerekli olan Microsoft.Practices.EnterpriseLibrary.Configuration.dll referansını eklemeliyiz. 

 

References'ı sağ tıklayalım. Add Reference>>Browse ile, C:\Program Files\Microsoft Enterprise Library June 2005\bin' gidip seçmeliyiz.

 

 

 

 

ConfigurationManager.GetConfiguration sectionName (bölüm adını)  String olarak alır.

 

 ConfigurationManager.WriteConfiguration metodu Section Name (bölüm adı)'nı string olarak,ve configurasyon değerlerini atadığımız nesneyi de object olarak alır.

AyarlarBölümü isimli configürasyon ayarı olan bir Uygulamada,  ayarlanan değerleri "obje" isimli nesnede tuttuğumuzu varsayarak configürasyon ayarlarını yazma ve okuma kodları şunlardır:

Configurasyon datası okuma:

VB.NET:
 
Dim obje As ClassAyarlar = DirectCast(ConfigurationManager.GetConfiguration("AyarlarBolumu"), ClassAyarlar)

C#.NET:

ClassAyarlar obje = ConfigurationManager.GetConfiguration("AyarlarBolumu") as ClassAyarlar;

Configurasyon Datası yazma:

VB.NET:

ConfigurationManager.WriteConfiguration("AyarlarBolumu",obje)

C#.NET:
ConfigurationManager.WriteConfiguration("AyarlarBölümü", obje);

 

Şimdi de bir uygulama ile bu kodları hayata geçirelim:

Biz ayarlar.config dosyasına yazıp oradan okuyacağımız için,  formumuza 2 buton ve bir Text elemanını aşağıdaki özelliklere özelliklere göre ekleyelim. Kodları yazarken, ClassAyarlar isimli bir class'ımız ve form1'imiz var olacak elimizde.

Text ID
WriteXml btnWriteXml
ReadXml btnReadXml
txtXmlKaydi

Reference'ımızı kullanabilemek için de import etmemiz gerekiyor.

 VB.NET:

Imports Microsoft.Practices.EnterpriseLibrary.Configuration

 

C#.NET:

Using Microsoft.Practices.EnterpriseLibrary.Configuration;

 

  !!StringBuilder'i kullanmak için:

using System.Text;'i eklemeliyiz...

 C#.NET

public class ClassAyarlar

private string adsoyad;

private string site;

public ClassAyarlar()

{}

public string AdSoyad

{

get{ return adsoyad;}

set {adsoyad = value;}

}

public string Site

{

get{return site;}

set{site=value;}

}

public override string ToString()

{

StringBuilder strB = new StringBuilder();

strB.AppendFormat("AdSoyad = {0}; Site = {1};",

AdSoyad.ToString(), Site.ToString());

return strB.ToString();}

}

 

C#.NET:

C#:NET:

private ClassAyarlar obje=new ClassAyarlar();

private void btnWriteXml_Click(object sender, System.EventArgs e)

{//ayarlar.config'e yazilacak data:

obje = new ClassAyarlar();

obje.AdSoyad="Serdar Temiz";

obje.Site="www.yazgelistir.com"; 

ConfigurationManager.WriteConfiguration("AyarlarBolumu",obje); 

btnWriteXml.Enabled=false;

}

private void btnReadXml_Click(object sender, System.EventArgs e)

{//Configurasyon bilgilerini alsin

obje =ConfigurationManager.GetConfiguration("AyarlarBolumu") as ClassAyarlar;

txtXmlKaydi.Text=obje.ToString();

}

 

 

C#.NET:

 

 

 

 VB.NET:

 !!StringBuilder'i kullanmak için:

Imports System.Text;'i eklemeliyiz...

 

Imports System.Text

Public Class ClassAyarlar

Private AdiSoyadi As String

Private Sitesi As String

Public Property AdSoyad() As String

Get

Return AdiSoyadi

End Get

Set(ByVal Value As String)

AdiSoyadi = Value

End Set

End Property

Public Property Site() As String

Get

Return Sitesi

End Get

Set(ByVal Value As String)

Sitesi = Value

End Set

End Property

Public Overrides Function ToString() As String

Dim strB As StringBuilder = New StringBuilder

strB.AppendFormat("AdSoyad = {0};Site = {1}", AdSoyad, Site)

Return strB.ToString()

End Function

End Class

VB.NET:

 VB:NET:

 

 

VB.NET:

Public obje As ClassAyarlar = New ClassAyarlar

Private Sub btnWriteXml_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteXml.Click

obje.AdSoyad = "Serdar Temiz"

obje.Site = "yazgelistir.com"

ConfigurationManager.WriteConfiguration("AyarlarBolumu", obje)

btnWriteXml.Enabled = False

End Sub

Private Sub btnReadXml_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReadXml.Click

Dim obje As ClassAyarlar = DirectCast(ConfigurationManager.GetConfiguration("AyarlarBolumu"), ClassAyarlar)

txtXmlKaydi.Text = obje.ToString()

End Sub

End Class

 

Şimdi de uygulamamızı kaydedip çalıştıralım

 

WriteXml tuşuna basarak; XML dosyasına bilgileri yazalım.

 

 

 

Şimdi de XML dosyasından bilgileri okuyup textbox'a atalım.

 

 

Eğer Ayarlar.config'i açarsak, girdiğimiz bilgilerin kaydedildiğini görürüz.

 

Configuration Settings'teki Datayı Koruma:

Diyelim ki biz AyarlarBölümünü encrypte etmek istiyorum Bunun için ne yapmalıyız? Bunun ipucunu aslında eğer AyarlarBölümüne gelip, sağ panodaki Encrypt'ı tıklarsak, aşağı kısımda görebiliriz.

 Configuration Application Block encryption ayarlarını yapmak için biz adım adım ne yapacağımızı görelim.

Encryption Settings düğümünü sağ tıklayalım>>New>>File Key Algorithm Storage Provider

 

 

Ya  Create a new key algorithm pair Ya da Load an existing key algorithm pair  seçilir biz,Create a new key algorithm pair'i seçelim ve Next diyelim. (Bu kısım bittikten sonra diğer seçenek olan Load an Existing key algoritm pair için yapılması gerekenler anlatılacak)

Bir algoritme seçmemiz gerekli. Bunun çin de sağ taraftraki Select Algorithm düğmesine basalım, bakalım karşımıza neler çıkacak?

 

 

 

Type Selector'un altindaki .Net symetric algoritmalardan birini seçelim.(Eğer custom symetric istiyorsak Load Assembly'e basarız.) Next dedikten sonra

Encryption Setting adlı bölüm çıktı. Burada, hexadecimal anaktar da tanımlayabiliriz, ya da benim yaptığım gibi, Generate düğmesine basarak, otomatik bir tane oluştururuz. Sonra da Next'a basalım Karşımıza çıkan ekrandan, Select File seçerek, nereye algoritmayı saklayacağımızı belirleriz.

Uzantısı .key'dir.Biz isim olarak sifre'yi verelim sifre.key'i olusturalım

 

Burada   DPAPI  (Data Protection API) işletim sisteminin bir parçası olup, algoritma anahtarını içereren file'i da encripte/decryte  etmemize olanak sağlar. DPAPI user veya machine mod'da çalışır. Normalde key'ler plaintext olarak kaydedilir. Bu plaintext'e access hakkı olan herhangi bir kullanıcı veya uygulama buraya ulaşarak okuyup, configurasyon bölümlerini (configuration section) decripte edilmesine sebep olabilir. Ek koruma yapmak için DPAPI kullanmak faydalıdır. ACL'nin yaramadığı durumlarda, DPAPI işe yarar.

 User Mode: Sadece bir account, key dosyayı encrypt/decrypte edebilir.

Machine Mode: Sadece o bilgisayar'da, herhangi bir kullanıcı key dosyayı encrypt/decrypte edebilir. Machine mod seçildiğinde Entropy aktif olur.Entropy, machine mod'daki  ek korumadır ve bir baskıma şifre diyebiliriz buna.

Biz DPAPI korumasını seçelim ve User Mode'da çalışalım (istesek seçmeyebilirdik de)

 

 

 

Şimdi de Finish'e basalım. Böylelikle  Encryption Settings altında File Key Algoritm Storage Provider'ın eklendiğini görürüz. Sağ panoda da Dpapisettings' var.

 

Eğer mod'u değiştirmek istersek, DPAPI Mode:User kısmını tıklayıp ve aşağıdaki ekrandan istediğimiz mod'u seçebiliriz.

 

 User veya Machine DPAPI modları dışında, buradaki veri değiştirilemez. Bunun yerine bu alt tüğüm üzerine gelinip sağ tıklanarak, remove edilir ve yenisi yaratılır.

Şimdi de hem Enterprise Library'de hem de Web.config (veya App.config) dosyası kaydedilerek, yeni ayarlar etkili hale getirilir. Solution Explorer'de artık sifre.key dosyasını görebiliriz.

 

 

Şimdi de web.config'e bakarsak, yaptığımız ayarların nasıl yansıdığını görebiliriz.

 

Eğer var olan bir anahtarı kullanmak isteseydik: Load an Existing key algorithm seçip, Select file ile istediğimiz anatarın olduğu dosyayı seçerdik.

 

Eğer bu dosya  DPAPI ile korunuyor olsa ve bizim bu dosyayı açma hakkımız olmasa hata verir. Eper DPAPI koruması'nın chech box'ını seçmezsek şu hata ile karşılaşırız.

 

Eğer DPAPI korunması varsa fakat biz yanlış mod'u seçmiş isek gene hata verir. Önceden user mode ile haızrlanmış bir anahtarı Machine Mode ile tekrar kullanmak istediğimizi varsayalım:

 

 

Neyse, uygun durumları seçtikten sonra, geri kalan kısım,  Create A New Algorithm Key ile aynıdır

 

Peki Ben Encryption Ayarlarını yaptım bu var olan ayarları nasıl kullanacam? Configuration Application Block altındaki düğümlerde, encirpte etmek istediğimiz alt düğümü seçip, sa taraftaki pano da Encrypt: False kısmını, Encrypt: True yaparız ( decrypte için de tam tersini!)

 

 

 

Böylelikle Configuratin Application Block altındaki AyarlarBolumu'nu enkripte ettik.

 

Sonuç: Hep beraber Configuration Application Block'  için bir örnek yapıp bunu korumak için nasıl şifreyeleceğimizi gördük. Kodlarda herhangi bir değişiklik yapmadan, GUI aracı ile değişiklikler yapıp, rahat edebiliriz.

 

Teşekkür: Sevgili Hocam ve arkadaşım Özgür Altuntaş'a tavsiyeleri, eleştirileri ve desteği için çok teşekkür ediyorum. O olmazsa, napardım bilemiyorum:=)

 

Serdar Temiz   serdartemiz@yahoo.com