Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

C# Reflection

C# runtime’da tip bilgilerini elde edebilmemizi sağlayacak bir yapı sunmuştur ve buna reflection(yansıma) adı verilmiştir. Reflection sayesinde çok dinamik ve plug-in tabanlı uygulamalar geliştirmek imkansız olmaktan çıkmıştır. Kabaca reflectionı runtime da koda müdahale etmek olarak nitelendirebiliriz.
CLR(Common Language Runtime) içerisindeki kod bir assembly içerisine paketlenmiştir. Metadata CLR’ın kullandığı ve kodları execute ettiği ve bütün sınıf bilgilerini barındırdığı bir veridir.Bütün metod,property,event,delegate,enumaration’ların tip bilgileri metadata’da bulunur. Metadata parçalara ayrılmıştır.
Assembly Metadata : name,versiyon,strong name,culture gibi bilgiler bu parçada yer alır.

Type metadata : namespace ve class name’ler bu parçada bulunur.
Code (Intermediate Language Code) : Makine koduna çevrilmiş kod

Resources : string,image ve dosyalar gibi nesnelerdir.

 

//Mevcut çalışan kodun assembly’nin instance’ını yaratmak

Assembly asm = Assembly.GetExecutingAssembly();

String msg = String.Format(@”Full Name:{0},Location:{1},Only Reflection?:{2}”,

    asm.FullName,asm.Location,asm.ReflectionOnly);

MessageBox.Show(msg);

 

//Bu hata verir cunku Assembly’i sadece reclection için load ettik.

string fullName = “System.Transactions,Version 2.0.0.0,” +

    “Culture=neutral,PublicKeyToken=b77a5c561934e089”;

Assembly asm = Assembly.ReflectionOnlyLoad(fullName);

asm.CreateInstance(“System.Transactions.TransactionScope”);

 

//Her assembly en az bir modül içerir.

Assembly asm = Assembly.GetExecutingAssembly();

Module[] mods = asm.GetModules();

foreach (Module m in mods)

{

    Console.WriteLine(“Module Name:{0},n {1}”,m.Name,m.Assembly.FullName);

}

 

Properties altındaki AssemblyInfı sınıfı içerisinde assembly’nizin özelliklerini görebilirsiniz. Aşağıda bu sınıfa ait bazı attribute’ler listelenmiştir.
[
assembly: AssemblyTitle(“WindowsApp”)]

[assembly: AssemblyDescription(“”)]

[assembly: AssemblyConfiguration(“”)]

[assembly: AssemblyCompany(“”)]

[assembly: AssemblyProduct(“WindowsApp”)]

[assembly: AssemblyCopyright(“Copyright ©  2009”)]

[assembly: AssemblyTrademark(“”)]

[assembly: AssemblyCulture(“tr”)]

[assembly: AssemblyAlgorithmId(AssemblyHashAlgorithm.MD5)]

[assembly: AssemblyDefaultAlias(“DataLayer”)]

[assembly: ComVisible(false)]

[assembly: Guid(“41f2bb06-8f33-4321-8e41-76c503147f60”)]

[assembly: AssemblyVersion(“1.0.0.0”)]

[assembly: AssemblyFileVersion(“1.0.0.0”)]
[
assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileOptimizer | AssemblyNameFlags.EnableJITcompileTracking)]

 

//Bu kod ile çalışan assembly içerisindeki custom attribute’lar listelenir.

Assembly asm = Assembly.GetExecutingAssembly();

object[] attrs = asm.GetCustomAttributes(false);

foreach (Attribute attr in attrs)

    Console.WriteLine(“Attribute:{0}”,attr.GetType());

 

Reflection Tipleri :

Bir nesnenin tipin 4 farklı şekilde alabiliriz. Bunlar ; Assembly sınıfı ile, Module sınıfı ile, bir nesnenin instance’ı ile veya typeof keywordu ile.

Type[] tt;

Assembly asm = Assembly.GetExecutingAssembly();

tt = asm.GetTypes();

 

Module[] mods = asm.GetModules();

Module m = mods[0];

tt = m.GetTypes();

 

object o = newobject();

Type t = o.GetType();

 

t = typeof(Int32);

 

Bu yöntemlerden biriyle tipi aldıktan sonra artık o tipin metodları,propertyleri, eventleri,interface’leri,kalıtım ağacı vs elimizin altında demektir.

 

Type t = typeof(String);

Console.WriteLine(” NameSpace : {0}”,t.Namespace);

Console.WriteLine(” FullName : {0}”, t.FullName);

Console.WriteLine(” IsValueType : {0}”, t.IsValueType);

Console.WriteLine(” IsSealed : {0}”, t.IsSealed);

Console.WriteLine(” IsAbstract : {0}”, t.IsAbstract);

Console.WriteLine(” IsPublic : {0}”, t.IsPublic);

Console.WriteLine(” IsClass : {0}”, t.IsClass);

 

//Bir sınıfın Property’lerini listelemek

Type t = typeof(System.Data.OleDb.OleDbCommand);

foreach (PropertyInfo item in t.GetProperties())

{

    Console.WriteLine(“{0} – {1}”,item.Name,item.MemberType);

}

//Bir sınıfın member’lerini listelemek

 Type t = typeof(System.Data.OleDb.OleDbCommand);

 //BindingFlagler ile filtre eklemek

BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

foreach (MemberInfo item in t.GetMembers(flags))

{

     if (item.MemberType == MemberTypes.Event) Console.WriteLine(“Bu bir Event”);

     elseif (item.MemberType == MemberTypes.Method) Console.WriteLine(“Bu bir Metod”);

      //…..

      Console.WriteLine(“{0} – {1}”, item.Name, item.MemberType);

}

 

Dinamik Kod Yazma : Buraya kadar mevcut olan dll’leri ve özelliklerini listelemeyi öğrendik artık referans olarak vermeden bir dll’i nasıl runtime’da çalıştırabiliriz ona bakacağız.

 

//Bu kod Hastable’ı referans göstermeden olusturup yeni bir hashtable yaratıyor.

Assembly asm = Assembly.LoadFile( @”C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscorlib.dll”);

Type hashType = asm.GetType(“System.Collection.Hashtable”);

//Constructoru parametre almayan

ConstructorInfo ctor = hashType.GetConstructor(Type.EmptyTypes);

object newHash = ctor.Invoke(newobject[] { });

 

MethodInfo meth = hashType.GetMethod(“Add”);

meth.Invoke(newHash, newobject[] { “Hi”, “Hello” });

//Yaratılan hastableın countu alınıyor.

PropertyInfo prop = hashType.GetProperty(“Count”);

int count = (int)prop.GetValue(newHash,null);

 

Örneğin bir sınıf içerisindeki statik metodları çağırmak istersek bu sefer sınıfın instance oluşturma işini atlayabiliriz.

 

Runtime’da Kod Oluşturma : Reflection sadece assembly ve tipleri hakkında bilgi alabilme ile sınırlı değildir. Reclection ile Runtime’da bir assembly oluşturabiliriz.

System.Reflection.Emit namespace’i altında bunu yapabilecek builder sınıfları mevcuttur. AssemblyBuilder bir assembly , MethodBuilder bir method , TypeBuilder bir tip oluşturmamıza imkan tanır.

İlk önce bir Assembly ve Module oluşturarak işlemlere başlayabiliriz.

 

//Runtime da Kod Oluşturma

AssemblyName asmName = newAssemblyName();

asmName.Name = “DinamikAssembly”;

AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName,

    AssemblyBuilderAccess.RunAndSave);

ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule(“MainMod”, “DinamikAssembly.dll”);

//Yeni bir public sınıf oluşturuyoruz.

TypeBuilder typeBuilder = modBuilder.DefineType(“Sinif1”, TypeAttributes.Public | TypeAttributes.Class);

//Bir sınıf daha oluşturuldu.Base’i Hastable ve IDisposable ı implement edecek.

TypeBuilder typeBuilder2 = modBuilder.DefineType(“Sinif2”, TypeAttributes.Public | TypeAttributes.Class, typeof(Hashtable),newType[]{typeof(IDisposable)});

ConstructorBuilder ctorBuilder = typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);

ILGenerator codeGen = ctorBuilder.GetILGenerator();

codeGen.Emit(OpCodes.Ret);

//…………….

asmBuilder.Save(asmName+“.dll”);

 

Reflection ile ilgili anlatacaklarım bu kadar.Herkese iyi çalışmalar.

Temmuz 14, 2010 Posted by | C# | , , , | 1 Yorum

Interoperation COM,API

Bu makalemizde managed kod içerisinden unmanaged kodlara erişim konusunu ele alacağız. Peki bu neden gerekli örneğin uygulamanız içerisinde Microsoft Excel’i runtime da kullanmanız gerekli fakat Excel kütüphanesi .NET Framework içerisinde gömülü gelmiyor. Excel’i kullanabilmeniz için Component Object Model (COM) dediğimiz modeli kullanmamız gerekir ki buna interoperation denir.

 

COM nesnelerini VS içerisinde kullanabilmek için önce Regsvr32  komutu ile register edilmelidirler. Register edildikten sonra VS ile veya Type Library Importer tool(TlbImp.exe) ile bu bileşenler import edilmeliler.

Mevcut windowsa register edilmiş COM nesnelerini VS’da Add Reference dediğimizde COM tabının altında bulabiliriz.

 

Excelden okuma yapan kod örneği
publicclassInteropReader : FileReader ,IDisposable

{

    private Application oXL;

    private Workbook oWB;

    private Worksheet oSheet;

    private Range oRng;

 

    public InteropReader(string filepath)

    {

        base.FilePath = filepath;

        base.FileName = filepath;

        base.FileType = TypeConvert.StringToFileType(FileName);

    }

 

    publicoverride DataSet Read()

    {

        switch (FileType)

        {

              case FileTypes.xls:

              case FileTypes.xlsx:

                  return ExcelRead();

              default:

                  thrownewException(“Yontem Dosya Formati Desteklenmiyor…”);

          }

      }

 

  private DataSet ExcelRead()

  {

      System.Data.DataTable dt = new System.Data.DataTable(“dtExcel”);

      ds = new DataSet();

      ds.Tables.Add(dt);

      DataRow dr;

 

      oXL = new ApplicationClass();

      System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;

      System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(“en-US”);

            try

            {

                oWB = oXL.Workbooks.Open(FilePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, /*Excel.XlPlatform.xlWindows*/Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oWB.Sheets[1];

 

                StringBuilder sb = newStringBuilder();

                int jValue = oSheet.UsedRange.Cells.Columns.Count;

                int iValue = oSheet.UsedRange.Cells.Rows.Count;

 

                for (int j = 1; j <= jValue; j++)

                {

                    dt.Columns.Add(“column” + j, System.Type.GetType(“System.String”));

                }

 

                for (int i = 1; i <= iValue; i++)

                {

                    dr = ds.Tables[“dtExcel”].NewRow();

                    for (int j = 1; j <= jValue; j++)

                    {

                        oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[i, j];

                        string strValue = oRng.Text.ToString();

                        dr[“column” + j] = strValue;

                    }

                    ds.Tables[0].Rows.Add(dr);

                }

            }

            catch (Exception ex)

            {

                Dispose();

                thrownewException(“Excel Okunurken Bir Hata Olustu…” + ex.Message);

            }

            finally

            {

                Dispose();

 

                ds = DataObject.SetFirstRowAsColumn(ds);

 

            }

            System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;

            return ds;

        }

 

        publicvoid Dispose()

        {

            oWB.Close(Missing.Value, Missing.Value, Missing.Value);

            oXL.Workbooks.Close();

            Process[] pProcess;

            pProcess = System.Diagnostics.Process.GetProcessesByName(“Excel”);

            pProcess[0].Kill();

            GC.Collect();

        }

    }

 

 

COM Interoplarını kullanan .NET tool’ları aşağıdadır.
TypeLibraryImporter(TlbImp.exe) : Yeni bir .NET assembly’si import eder

TypeLibraryExporter(TlbExp.exe) : .NET uygulamaları için COM yaratır.

RegisteryEditor(Regedit.exe) : Her COM nesnesinin windows registery de bir kaydı olması gerekir.Mevcut registery entry’lerini arama ve yönetmeye yarar.

IntermediateLanguageDisassembler(Ildasm.exe) : IL’i görsel olarak görüntüler.

AssemblyRegistrationTool(Regasm.exe) : System Registration veritabanına .NET assembly’lerini eklemeye ve silmeye yarar.

 

Örneğin Bir Pdf dosyasını VS içerisinden Adobe Acrobat 7.0 Browser Document bileşenini toolboxtan sürükleyip windows formunuzda gösterebilirsiniz.

axAcroPDF1.LoadFile(“abc.pdf”);

axAcroPDF1.Print();

 

Mevcut COM nesneleri haricinde kendi geliştirdiğimiz bir dll’i de COM bileşeni haline çevirebiliriz.COM Callable Wrapper(CCW) .NET ile COM arasındaki öğeleri handle eden bir proxy’dir. Bunu Proje özelliklerinden Register For COM Interop checkbpxını işaretleyerek saplayabiliriz. Normal bir sınıf yazdığımızda bu sınıfın bütün öğeleri COM’da da görülür. Eğer bir sınıfın COM’da görülmesini engellemek istiyorsak o zaman COMVisible(false) niteliği o öğeye vermeliyiz.

publicclassComVisiblePersonel

{

public ComVisiblePersonel()

    {

 

    }

    [ComVisible(true)]

    publicstring Adi;

 

    [ComVisible(false)]

    publicdecimal Maas;

}

 

COM’a expose ederken şunlara dikkat etmeliyiz.

–        Bütün sınıfların parametre almaya default constructoru olmalıdır.

–        Expose edilecek tipler ve üyeler public olmalıdır.

–        Abstract sınıflar expose edilemez.

 

Expose işlemini önce uygulamayı derleyip daha sonra TlbExp.exe yi VS komut satırında çağırarak yapabiliriz.

Csc /t:library ComVisiblePersonel.cs

Bu komutu çalıştırdıktan sonra uygulamamıza bir resource dosyası eklenir. ComVisiblePersonel.res

 

Unmanaged Code kullanımı

API’nin açılımı ; Application Programming Interface (Uygulama Programlama Arayüzü)dir. API’ler bize başka sistemlerle etkileşimi sağlar.C# içine entegre olmamış bazı yapıları API’ler içerinde bulabilmemiz mümnkün. Bunu DLLImport sınıfını kullanarak yapabiliriz. using System.Runtime.InteropServices; Bu sınıf ile kullanmak istediğimiz dll ismini veriyoruz ve extern keywordu ile bu metodun dışarıdan çağrılacağını belirtiyoruz.

 

CD ROM için API kullanımı

[DllImport(“winmm”)]

privatestaticexternint mciSendString(string strCommand, StringBuilder strReturn, int iReturnLenght, IntPtr hwndCallback);

void cdCikar()

{

    //cd rom sürücüsü çıkıyor

    mciSendString(“Set cdaudio door open”, null, 0, IntPtr.Zero);

}

 

.NET uygulamalarındaki bir tipi unmanaged bir dll deki bir tipe dönüştürmek mümkün.

Bunu aşağıdaki şekilde yapabiliriz.
publicclassMarshalAsDemo

{

    [MarshalAs(UnmanagedType.LPStr)]

    publicString FirstName;

    [MarshalAs(UnmanagedType.Bool)]

    publicBoolean IsCurrentlyWorking;

}

Temmuz 13, 2010 Posted by | C# | , , , , | Yorum bırakın

Encrypting and Decrypting Data (Veri şifreleme)

Veri güvenliğini sağlamak için veriyi şifreli bir şekilde transfer etmek önemlidir. Bunun için şifreleme tekniklerini bu makalede inceliyor olacağız. Bunun için .NET Framework bize bazı kütüphaneler sunmaktadır. (System.Security.Cryptography)

 

Simertrik Algoritmalar : Veriyi bir anahtar sözcük yardımıyla şifreler ve aynı anahtar ile geri açar. Bu algoritmalara örnek olarak ;

RijndaelManaged,RC2,DES,TripleDES verilebilir. Bütün simetrik algoritma sınıfları System.Securiy.Cryptography.SymmetricAlgorithm base sınıfından türerler.

 

BEST PRACTICES:

– Eğer encryptor ve decryptor windows XP ise Rijndael kullanmakta fayda var. Kırılması en zor algoritma Rijndael’dir . Aksi taktirde TripleDES kullanmalıyız.

 

//Simetrik algoritma ile şifreleme ve çözme

string inFileName = @”C:028442.BIE”, outFileName = @”C:028442.BIE.enc”;

// 1: Stream nesneleri yaratılır.

FileStream inFile = newFileStream(inFileName, FileMode.Open, FileAccess.Read);

FileStream outFile =newFileStream(outFileName,FileMode.OpenOrCreate,FileAccess.Write);

// 2: Simetrik algoritma nesnesi yaratılır.

SymmetricAlgorithm myAlg = newRijndaelManaged();

// 3: Random Bir key oluşturulur (opsiyonel)

myAlg.GenerateKey();

// 4: Şifreli olmayan dosya okunur.

byte[] fileData = newbyte[inFile.Length];

inFile.Read(fileData, 0, (int)inFile.Length);

// ICryptoTransform nesnesi yaratılır.

ICryptoTransform encryptor = myAlg.CreateEncryptor();

// 5: Crypto Stream yaratılıp veri yazılır

CryptoStream encryptStream = newCryptoStream(outFile, encryptor, CryptoStreamMode.Write);

encryptStream.Write(fileData, 0, fileData.Length);

// 6: Kapat

encryptStream.Close();

inFile.Close();

outFile.Close();

           

 

Asimetrik Algoritmalar : Genelde açık anahtar şifreleme olarak bilinir. Simetrik algoritmalar göre yavaştırlar.  System.Security.Cryptography.AsymmetricAlgorithm altındaki sınıflar ile asimetrik şifreleme yapabiliriz. .NET altındaki asimetrik algoritmalar şunlardır ; RSA , DSA

//Tekrar kullanmak için Key Pairları oluşturmak

CspParameters persistanCsp = newCspParameters();

persistanCsp.KeyContainerName = “Asimetrik”;

RSACryptoServiceProvider myRSA = newRSACryptoServiceProvider(persistanCsp);

myRSA.PersistKeyInCsp = true;

RSAParameters privateKey = myRSA.ExportParameters(true);

foreach (byte item in privateKey.D)

    Console.Write(item.ToString(“X2”)+” “);

 

Bunlarında dışında Hash algoritmaları vardır. Bunlarda orijinal data bilinemez. Sadece o verinin doğruluğu bilinebilir.
//MD5 ile şifresiz Hash

MD5 myHash = newMD5CryptoServiceProvider();

FileStream file = newFileStream(“buffered.txt”, FileMode.Open, FileAccess.Read);

BinaryReader reader = newBinaryReader(file);

myHash.ComputeHash(reader.ReadBytes((int)file.Length));

Console.Write(Convert.ToBase64String(myHash.Hash));

Temmuz 13, 2010 Posted by | ASP.NET | , , , , | Yorum bırakın

User and Data Security (Kullanıcı ve Veri Güvenliği)

     Bu makalede kullanıcı bazlı veri güvenliği konusuna değineceğiz. Örneğin bir uygulamada kullanıcılar sadece kendi verilerini görür , yönetici bütün verileri görür , authenticate olmamış bir kullanıcı ise hiçbir veriyi göremez gibi kısıtlar koyulması gerekebilir. Role-Based Security diye tabir edilen kontrol sistemi yardımıyla bunu gerçekleştirmek mümkündür.RBS yi ister lokal kullacı veritabanı ile ister active directory ile istersek de custom kullanıcı tabloları ile gerçekleştirebiliriz. Ayrıca bu kritik verileri daha güvenli hale getirmek için encrypted olarak tutmakta yarar vardır. Bu makalede iki kavram üzerine yoğunlaşacağız. Bunlardan birisi Authentication diğeri ise Authırization. Peki ikisinin arasındaki fark nedir.

Authentication(Kimlik Doğrulama) : Kullanıcının kimliğini kontrol etmek.

Authorization(Yetki , izin) : Kullanıcını kaynaklara erişimini doğrulamak.

Bir kullanıcı sisteme giriş yapabilmek için authentication , o sistemde bir işlem yapabilmek için authorization ‘a ihtiyaç duyar.

Eğer kullanıcılar için lokal user veritabanını veya activedirectory’i kullanırsak .NET Framework içerisindeki WindowsIdentity ve WindowsPrincipal sınıfları ile entegre edebiliriz. Eğer kendi user veritabanımızı kullanırsak da GenericIdentity ve GenericPrincipal sınıflarını entegre edebiliriz.

Eğer tam bir kontrol istiyorsak IIdentity ve IPrinciple interface’lerinden implemente edebiliriz.

 

System.Security.Principal.WindowsIdentity sınıfı windows user accountu temsil eder. Bu sınıf tan bir instanse oluşturabilmek için GetAnonmous,GetCurrent,Impersonate metodlarından biri çağrılır.
GetAnonymous (Anonim) : Kimlik doğrulaması yapılmamış windows userını temsil eder.
GetCurrent : O andaki windows userını temsil eder.

Impersonate : Belirtilen userın WindowsImpersonationIdentityContext nesnesi döndürür.


WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent();

Console.WriteLine(“Name:” + currentIdentity.Name);

Console.WriteLine(“Token:” + currentIdentity.Token);

Console.WriteLine(“Authentication Type:” + currentIdentity.AuthenticationType);

 

if (currentIdentity.IsAnonymous) MessageBox.Show(“Anonim Kullanıcı”);

if (currentIdentity.IsAuthenticated) MessageBox.Show(“Kimlik Doğrulaması Yapılmamış”);

if (currentIdentity.IsGuest) MessageBox.Show(“Guest kullanıcısı”);

if (currentIdentity.IsSystem) MessageBox.Show(“Sistem kullanıcısı”);

 

//Windows Principal

WindowsIdentity currnentIdentity = WindowsIdentity.GetCurrent();

WindowsPrincipal currentPrinciple = newWindowsPrincipal(currnentIdentity);

               AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

//Alternatif

WindowsPrincipal currentPrincipal2 = (WindowsPrincipal)Thread.CurrentPrincipal;

 

 

//Windowsa giriş yapan kullanıcı Admin mi

WindowsPrincipal currenntPrincipal = newWindowsPrincipal(WindowsIdentity.GetCurrent());

bool IsAdmin = currenntPrincipal.IsInRole(WindowsBuiltInRole.Administrator);

MessageBox.Show(IsAdmin.ToString());

 

System.Security.Permissions.PrincipalPermissino sınıfı PermissionAttribute sınıfı ile birlikte güvenlik prensiplerini uygulamaya yarar.PrinciplePermission un 3 önemli property si vardır.

Authenticated : true olursa kullanıcı authenticate olmaya ihtiyaç duyar.

Name : User Name ile aynı olması gerekir.

Role : Principal Role lerden biri ile aynı olması gerekir.

rincipalPermission p = newPrincipalPermission(“name”, “role”, true);

Examtip : PrinciplePermission 3 property si var . Fullname,phone gibi özellikler bu sınıfa ait değil.

 

 

[PrincipalPermission(SecurityAction.Demand,Role=@”BUILTINAdministrators”)]

privatevoid AdministratorsOnlyMethod()

{

    //Bu metodu sadece Adminler çalıştırabilir. Eğer Admin değilse

    //SecurityException fırlatır.

}

 

GenericIdentity myUser1 = newGenericIdentity(“User1”);

GenericIdentity myUser2 = newGenericIdentity(“User2”,“SmardCard”);

 

String[] myRoles = newString[]{“IT”,“Users”,“Administrators”};

 

GenericPrincipal myPrinciple = newGenericPrincipal(myUser1, myRoles);

 

bool HasUserRole = myPrinciple.IsInRole(“Users”);

MessageBox.Show(HasUserRole.ToString());


Thread.CurrentPrincipal = myPrinciple1;

TestSecurity(); //User1 IT Userı olduğu için bu metodu çağırabilir

Thread.CurrentPrincipal = myPrinciple2;

TestSecurity(); //User2 IT Userı olmadığı için bu metod runtime da hata verir.


[PrincipalPermission(SecurityAction.Demand,Role=“IT”)]

privatevoid TestSecurity()

{

    MessageBox.Show(Thread.CurrentPrincipal.Identity.Name+” is IT User”);

}

 

 

Access Control List (ACS) : Dosyalara,klasörlere,printerlara,servislere,registery’e ve diğer işletim sistemi kaynaklarına erişim ACL tekniği tarafından kısıtlanabilir.
//Bir dizine Access Rule Vermek

            string dir = @”C:test”;

            DirectorySecurity ds = Directory.GetAccessControl(dir);

            ds.AddAccessRule(newFileSystemAccessRule(“Guest”, FileSystemRights.Read, AccessControlType.Allow));

            Directory.SetAccessControl(dir, ds);

Temmuz 12, 2010 Posted by | C# | , , , | 1 Yorum

Application Security (Uygulama Güvenliği)

Uygulama güvenliğinden kastettiğimiz şey aslında yaptığımız exe veya dll in dağıtım aşamasından sonra Reflector tarzı bir program ile açılıp kodlarının incelenip zararlı dll ler ile değiştirilmesini engellemek olarak özetleyebiliriz.
Tahmin ediyorum ki herkes şu şekilde bir uyarı duymuştur ; bilgisayarınıza admin olarak giriş yapmayın. Bunun  söylenmesindeki amaç kendinize güvenmemeniz , hardiskteki bütün bilgileri sileceğinizden dolayı değildir tabi zaten kimse böyle bir şey yapmaz J
Bunun söylenmesinin nedeni kullanmakta olduğunuz uygulamaların bilgisyaarınıza zarar vermesini engellemektir.CAS(Code Access Security) .NET Framework içerisinde bulunan ve uygulamaların izinleri kontrol eden bir yapıdır.
Örneğin CAS ile farklı bir uygulamaya sınırlı erişim yapacağınız zaman registery’e read veya write izni verebilirsiniz.Dosya sistemine , registery’e printerlara veya event loglara rol bazlı güvenlik kriterleri uygulayabilirsiniz.Ancak rol bazlı güvenlik ile internet veya DNS kısıtlaması yapamazsınız.Harici kullandığımız assembly’leri CAS ile kısıtlamaz isek full trusted bir şekilde yönetilemeyen kodlar çalıştırmasına da izin vermiş oluruz ki bu risk unsurları içerebilir.

 

Evidence(Kanıt) : Bir assembly’nin hangi kod grubuna ait olduğunu belirten bir bilgidir.

Permission(İzin) : Spesifik bir aksiyonun assembly tarafından yapılıp yapılamayacağnı belirlemek için kullanılır. Örneğin bir assembly bir kullanıcıya open file dialog veya save file dialog  veya ikisinin bir gösterilmesi. Bu ayarlar .NET Framework Configuration tool’u ile yapılabilir.

 

Örneğin internet varsayılan permission seti file dialog , isolated storage file , security, user interface ve printingi içerir.Local intranet zone ise Environment değerlerini , file dialog , isolated file storage, reflection, security, user interface, DNS ve printing içerir.   

 

Security Policy : Kod gruplarının ve izinlerin mantıksal olarak gruplanmasıdır.

 

//Namespace’e eklenen bu nitelik ile CAS boot.ini dosyasına sadece okuma izni verilmiştir.

[assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum,Read=@”C:boot.ini”)]

namespace DeclarativeSecurity

{

    classProgram

    {

        staticvoid Main(string[] args)

        {

            //Do Some work

        }

    }

}

CAS sadece partial trusted assembly’ler içindir.Full trust assembly lerde ignore edilir.

 

Bir assembly güvenliğini artırmak için birkaç niteliği o assembly’e uygulayabiliriz. RegisteryPermission,UIPermission,PrintingPermission,FileIOPermission lara SecurityAction.RequestMinimum , SecurityAction.RequestOptioanal, SecurityAction.RequestRefuse şeklinde tanımlamalar yapabiliriz.
Herhangi bir registery keyine erişimi , bir path’i vs kısıtlayabiliriz.

 

Bu kısıtlamaları yapmak güvenli kod yazmak için çok önemlidir. Ayrıca kodu da çok kısa bir nitelik yazmaktan geçiyor. Güvenli kod için Best Practice SecurityAction’ı Optional yapmaktır.

Temmuz 11, 2010 Posted by | C# | , , , | Yorum bırakın