Kod Erişimi Güvenliği ve ADO.NET

.NET Framework, rol tabanlı güvenliğin yanı sıra kod erişimi güvenliği (CAS) sunar. Her ikisi de ortak dil çalışma zamanı (CLR) tarafından sağlanan ortak bir altyapı kullanılarak uygulanır. Yönetilmeyen kod dünyasında çoğu uygulama kullanıcı veya sorumlunun izinleriyle yürütülür. Sonuç olarak, kötü amaçlı veya hatayla doldurulmuş yazılımlar yükseltilmiş ayrıcalıklara sahip bir kullanıcı tarafından çalıştırıldığında bilgisayar sistemleri zarar görebilir ve özel veriler tehlikeye girebilir.

Buna karşılık, .NET Framework'te yürütülen yönetilen kod, yalnızca kod için geçerli olan kod erişimi güvenliğini içerir. Kodun çalışmasına izin verilip verilmeyeceği, yalnızca sorumlunun kimliğine değil, kodun kaynağına veya kodun kimliğinin diğer yönlerine bağlıdır. Bu, yönetilen kodun kötüye kullanılma olasılığını azaltır.

Not

Kod Erişim Güvenliği (CAS), .NET Framework ve .NET'in tüm sürümlerinde kullanım dışı bırakılmıştır. .NET'in son sürümleri CAS ek açıklamalarını dikkate almaz ve CAS ile ilgili API'ler kullanılırsa hata üretir. Geliştiriciler, güvenlik görevlerini yerine getirmek için alternatif yöntemler aramalıdır.

Kod Erişim İzinleri

Kod yürütülürken, CLR güvenlik sistemi tarafından değerlendirilen kanıtlar sunar. Bu kanıt genellikle URL, site ve bölge gibi kodun kaynağını ve derlemenin kimliğini güvence altına alan dijital imzaları içerir.

CLR, kodun yalnızca kodun gerçekleştirme iznine sahip olduğu işlemleri gerçekleştirmesine izin verir. Kod izin isteyebilir ve bu istekler bir yönetici tarafından ayarlanan güvenlik ilkesine göre yerine getirilir.

Not

CLR'de yürütülen kod kendisine izin veremez. Örneğin, kod bir güvenlik ilkesinin izin verdiğinden daha az izin isteyebilir ve bu izinlere daha az izin verilebilir, ancak hiçbir zaman daha fazla izin verilmez. İzinleri verirken, hiç izin olmadan başlayın ve ardından gerçekleştirilmekte olan belirli görev için en dar izinleri ekleyin. Tüm izinlerle başlayıp tek tek izinleri reddetmek, istenmeyen güvenlik açıkları içerebilen güvenli olmayan uygulamaların gerekenden daha fazla izin vermesine neden olur. Daha fazla bilgi için bkz . Güvenlik İlkesini Yapılandırma ve Güvenlik İlkesi Yönetimi.

Üç tür kod erişim izni vardır:

  • Code access permissions sınıfından CodeAccessPermission türetilir. Dosyalar ve ortam değişkenleri gibi korumalı kaynaklara erişmek ve yönetilmeyen koda erişme gibi korumalı işlemler gerçekleştirmek için izinler gereklidir.

  • Identity permissions bir derlemeyi tanımlayan özellikleri temsil eder. İzinler, dijital imza gibi öğeleri veya kodun kaynağı olan öğeleri içerebilen kanıta dayalı olarak bir derlemeye verilir. Kimlik izinleri de temel sınıftan CodeAccessPermission türetilir.

  • Role-based security permissions bir sorumlunun belirli bir kimliğe sahip olup olmadığına veya belirtilen rolün üyesi olmasına bağlıdır. sınıfı, PrincipalPermission etkin sorumluya karşı bildirim temelli ve kesinlik temelli izin denetimlerine izin verir.

Kodun bir kaynağa erişmeye veya bir işlem gerçekleştirmeye yetkili olup olmadığını belirlemek için, çalışma zamanının güvenlik sistemi çağrı yığınını geçirerek her çağıranın verilen izinlerini istenen izinle karşılaştırmaktadır. Çağrı yığınındaki herhangi bir çağıranın istenen izni yoksa, bir SecurityException oluşturulur ve erişim reddedilir.

İzin İsteme

İzin istemenin amacı, çalışma zamanına uygulamanızın çalışması için hangi izinleri gerektirdiğini bildirmek ve yalnızca gerçekten ihtiyaç duyduğu izinleri aldığından emin olmaktır. Örneğin, uygulamanızın yerel diske veri yazması gerekiyorsa, gerektirir FileIOPermission. Bu izin verilmediyse, diske yazmaya çalıştığında uygulama başarısız olur. Ancak, uygulama istekte bulunursa FileIOPermission ve bu izin verilmediyse, uygulama en baştan özel durum oluşturur ve yüklenmez.

Uygulamanın yalnızca diskteki verileri okuması gereken bir senaryoda, hiçbir zaman yazma izni verilmemesi için istekte bulunabilirsiniz. Bir hata veya kötü amaçlı bir saldırı durumunda kodunuz üzerinde çalıştığı verilere zarar veremez. Daha fazla bilgi için bkz . İstek İzinleri.

Rol Tabanlı Güvenlik ve CAS

Hem rol tabanlı güvenlik hem de koda erişilen güvenlik (CAS) uygulamak, uygulamanız için genel güvenliği artırır. Rol tabanlı güvenlik, bir Windows hesabını veya özel kimliği temel alarak güvenlik sorumlusu hakkındaki bilgileri geçerli iş parçacığında kullanılabilir hale getirir. Ayrıca, uygulamaların genellikle kullanıcı tarafından sağlanan kimlik bilgilerine göre verilere veya kaynaklara erişim sağlaması gerekir. Bu tür uygulamalar genellikle bir kullanıcının rolünü denetler ve bu rollere göre kaynaklara erişim sağlar.

Rol tabanlı güvenlik, bir bileşenin çalışma zamanında geçerli kullanıcıları ve ilişkili rollerini tanımlamasını sağlar. Bu bilgiler daha sonra çalışma zamanında verilen izin kümesini belirlemek için cas ilkesi kullanılarak eşlenir. Belirtilen bir uygulama etki alanı için, konak varsayılan rol tabanlı güvenlik ilkesini değiştirebilir ve bir kullanıcıyı ve bu kullanıcıyla ilişkili rolleri temsil eden bir varsayılan güvenlik sorumlusu ayarlayabilir.

CLR, yönetilen kod üzerinde kısıtlamaları zorlama mekanizmasını uygulamak için izinleri kullanır. Rol tabanlı güvenlik izinleri, bir kullanıcının (veya kullanıcının adına hareket eden aracının) belirli bir kimliğe sahip olup olmadığını veya belirtilen rolün üyesi olup olmadığını keşfetmeye yönelik bir mekanizma sağlar. Daha fazla bilgi için bkz . Güvenlik İzinleri.

Oluşturduğunuz uygulamanın türüne bağlı olarak, veritabanında rol tabanlı izinler uygulamayı da düşünmelisiniz. SQL Server'da rol tabanlı güvenlik hakkında daha fazla bilgi için bkz . SQL Server Güvenliği.

Bütünleştirilmiş Kodlar

Derlemeler bir .NET Framework uygulaması için temel dağıtım, sürüm denetimi, yeniden kullanım, etkinleştirme kapsamını ve güvenlik izinlerini oluşturur. Derleme, birlikte çalışacak ve mantıksal bir işlev birimi oluşturacak şekilde oluşturulmuş bir tür ve kaynak koleksiyonu sağlar. CLR için, bir derleme bağlamının dışında bir tür yoktur. Derleme oluşturma ve dağıtma hakkında daha fazla bilgi için bkz . Derlemelerle Programlama.

Tanımlayıcı adlandırma Derlemeleri

Tanımlayıcı ad veya dijital imza, derlemenin basit metin adını, sürüm numarasını ve kültür bilgilerini (sağlanırsa) içeren kimliğinin yanı sıra ortak anahtar ve dijital imzadan oluşur. Dijital imza, karşılık gelen özel anahtar kullanılarak bir derleme dosyasından oluşturulur. Derleme dosyası, derlemeyi oluşturan tüm dosyaların adlarını ve karmalarını içeren derleme bildirimini içerir.

Derlemeyi güçlü adlandırma, bir uygulamaya veya bileşene, diğer yazılımların açıkça başvurmak için kullanabileceği benzersiz bir kimlik verir. Güçlü adlandırma, derlemeleri, düşman kodu içeren bir derleme tarafından yanıltılmaya karşı koruma sağlar. Tanımlayıcı adlandırma, bir bileşenin farklı sürümleri arasında sürüm tutarlılığı da sağlar. Genel Bütünleştirilmiş Kod Önbelleği'ne (GAC) dağıtılacak derlemeleri kesin olarak adlandırmanız gerekir. Daha fazla bilgi için bkz . Tanımlayıcı Adlandırılmış Derlemeler Oluşturma ve Kullanma.

ADO.NET 2.0'da Kısmi Güven

ADO.NET 2.0'da SQL Server için .NET Framework Veri Sağlayıcısı, OLE DB için .NET Framework Veri Sağlayıcısı, ODBC için .NET Framework Veri Sağlayıcısı ve Oracle için .NET Framework Veri Sağlayıcısı artık kısmen güvenilen ortamlarda çalıştırılabilir. .NET Framework'ün önceki sürümlerinde yalnızca System.Data.SqlClient tam güvenden daha az uygulamada destekleniyordu.

En azından, SQL Server sağlayıcısını kullanan kısmen güvenilen bir uygulamanın yürütme ve SqlClientPermission izinlere sahip olması gerekir.

Kısmi Güven için İzin Özniteliği Özellikleri

Kısmi güven senaryolarında, SQL Server için .NET Framework Veri Sağlayıcısı için kullanılabilir özellikleri daha fazla kısıtlamak için üyeleri kullanabilirsinizSqlClientPermissionAttribute.

Aşağıdaki tabloda kullanılabilir SqlClientPermissionAttribute özellikler ve açıklamaları listelemektedir:

İzin özniteliği özelliği Açıklama
Action Bir güvenlik eylemi alır veya ayarlar. öğesinden SecurityAttributedevralındı.
AllowBlankPassword bağlantı dizesi boş parola kullanımını etkinleştirir veya devre dışı bırakır. Geçerli değerler şunlardır true (boş parola kullanımını etkinleştirmek için) ve false (boş parola kullanımını devre dışı bırakmak için). öğesinden DBDataPermissionAttributedevralındı.
ConnectionString İzin verilen bir bağlantı dizesi tanımlar. Birden çok bağlantı dizesi tanımlanabilir. Not: bağlantı dizesi kullanıcı kimliği veya parola eklemeyin. Bu sürümde, .NET Framework Yapılandırma Aracı'nı kullanarak bağlantı dizesi kısıtlamalarını değiştiremezsiniz.

öğesinden DBDataPermissionAttributedevralındı.
KeyRestrictions İzin verilen veya izin verilmeyen bağlantı dizesi parametreleri tanımlar. Bağlan ion dizesi parametreleri formda < tanımlanırparametre adı>=. Noktalı virgül (;)) kullanılarak sınırlandırılmış birden çok parametre belirtilebilir. Not: belirtmezsenizKeyRestrictions, ancak özelliğini veya PreventUsageolarak AllowOnly ayarlarsanız KeyRestrictionBehavior ek bağlantı dizesi parametresine izin verilmez. öğesinden DBDataPermissionAttributedevralındı.
KeyRestrictionBehavior bağlantı dizesi parametrelerini izin verilen tek ek parametre ()AllowOnly olarak tanımlar veya izin verilmeyen ek parametreleri (PreventUsage) tanımlar. AllowOnly varsayılan değerdir. öğesinden DBDataPermissionAttributedevralındı.
TypeID Türetilmiş bir sınıfta uygulandığında bu öznitelik için benzersiz bir tanımlayıcı alır. öğesinden Attributedevralındı.
Unrestricted Kaynak için kısıtlanmamış iznin bildirilip bildirilmediğini gösterir. öğesinden SecurityAttributedevralındı.

Bağlan ionString Söz Dizimi

Aşağıdaki örnekte, yalnızca belirli bir bağlantı dizesi kullanılmasına connectionStrings izin vermek için yapılandırma dosyasının öğesinin nasıl kullanılacağı gösterilmektedir. Yapılandırma dosyalarından bağlantı dizesi depolama ve alma hakkında daha fazla bilgi için bkz. Bağlan ion Dizeleri.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;" />  
</connectionStrings>  

KeyRestrictions Söz Dizimi

Aşağıdaki örnek aynı bağlantı dizesi etkinleştirir, ve Packet Size bağlantı dizesi seçeneklerinin Encrypt kullanımını etkinleştirir, ancak diğer bağlantı dizesi seçeneklerinin kullanımını kısıtlar.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;"  
    KeyRestrictions="Encrypt=;Packet Size=;"  
    KeyRestrictionBehavior="AllowOnly" />  
</connectionStrings>  

PreventUsage Sözdizimi ile KeyRestrictionBehavior

Aşağıdaki örnek aynı bağlantı dizesi etkinleştirir ve ve dışındaki diğer tüm bağlantı parametrelerine User IdPasswordPersist Security Infoizin verir.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;"  
    KeyRestrictions="User Id=;Password=;Persist Security Info=;"  
    KeyRestrictionBehavior="PreventUsage" />  
</connectionStrings>  

AllowOnly Söz Dizimi ile KeyRestrictionBehavior

Aşağıdaki örnek , , Connection TimeoutEncryptve Packet Size parametreleri de içeren Initial Catalogiki bağlantı dizesi etkinleştirir. Diğer tüm bağlantı dizesi parametreleri kısıtlanmıştır.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;"  
    KeyRestrictions="Initial Catalog;Connection Timeout=;  
       Encrypt=;Packet Size=;"
    KeyRestrictionBehavior="AllowOnly" />  
  
  <add name="DatabaseConnection2"
    connectionString="Data Source=SqlServer2;Initial
    Catalog=Northwind2;Integrated Security=true;"  
    KeyRestrictions="Initial Catalog;Connection Timeout=;  
       Encrypt=;Packet Size=;"
    KeyRestrictionBehavior="AllowOnly" />  
</connectionStrings>  

Özel İzin Kümesi ile Kısmi Güveni Etkinleştirme

Belirli bir bölge için izin kullanımını System.Data.SqlClient etkinleştirmek için, sistem yöneticisinin özel bir izin kümesi oluşturması ve bunu belirli bir bölge için izin kümesi olarak ayarlaması gerekir. gibi LocalIntranetvarsayılan izin kümeleri değiştirilemez. Örneğin, System.Data.SqlClient bir ZoneLocalIntranetsistem yöneticisi , için izin kümesini LocalIntranetkopyalayıp "CustomLocalIntranet" olarak yeniden adlandırabilir, izinleri ekleyebilirSystem.Data.SqlClient, Caspol.exe (Kod Erişim Güvenlik İlkesi Aracı) kullanarak CustomLocalIntranet izin kümesini içeri aktarabilir ve izin kümesini LocalIntranet_Zone CustomLocalIntranet olarak ayarlayabilir.

Örnek İzin Kümesi

Aşağıda, kısmen güvenilen bir senaryoda SQL Server için .NET Framework Veri Sağlayıcısı için örnek bir izin kümesi verilmiştir. Özel izin kümeleri oluşturma hakkında bilgi için bkz . Caspol.exe Kullanarak İzin Kümelerini Yapılandırma.

<PermissionSet class="System.Security.NamedPermissionSet"  
  version="1"  
  Name="CustomLocalIntranet"  
  Description="Custom permission set given to applications on  
    the local intranet">  
  
<IPermission class="System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  
version="1"  
AllowBlankPassword="False">  
<add ConnectionString="Data Source=(local);Integrated Security=true;"  
 KeyRestrictions="Initial Catalog=;Connection Timeout=;  
   Encrypt=;Packet Size=;"
 KeyRestrictionBehavior="AllowOnly" />  
 </IPermission>  
</PermissionSet>  

Güvenlik İzinlerini Kullanarak kod erişimini ADO.NET doğrulama

Kısmi güven senaryolarında, bir belirterek SqlClientPermissionAttributekodunuzdaki belirli yöntemler için CAS ayrıcalıkları gerektirebilirsiniz. Kısıtlı güvenlik ilkesinin geçerli olduğu ayrıcalıklara izin verilmiyorsa, kodunuz çalıştırılmadan önce bir özel durum oluşturulur. Güvenlik ilkesi hakkında daha fazla bilgi için bkz . Güvenlik İlkesi Yönetimi ve Güvenlik İlkesi En İyi Yöntemleri.

Örnek

Aşağıdaki örnek, belirli bir bağlantı dizesi gerektiren kodun nasıl yazıldığını gösterir. Bir sistem yöneticisinin gerçek dünyada CAS ilkesi kullanarak uygulayacağı kısıtlanmamış izinleri System.Data.SqlClientreddetme simülasyonu yapar.

Önemli

ADO.NET için CAS izinleri tasarlarken doğru desen en kısıtlayıcı durumla (hiç izin olmadan) başlayıp kodun gerçekleştirmesi gereken belirli görev için gereken belirli izinleri eklemektir. Tüm izinlerle başlayıp belirli bir izni reddetmenin tersi desen, aynı bağlantı dizesi ifade etmenin birçok yolu olduğundan güvenli değildir. Örneğin, tüm izinlerle başlayıp "server=someserver" bağlantı dizesi kullanımını reddetmeye çalışırsanız, "server=someserver.mycompany.com" dizesine yine de izin verilir. Her zaman hiçbir izin vermeyerek başlayarak, izin kümesinde delikler olma olasılığını azaltırsınız.

Aşağıdaki kod, uygun CAS izinlerinin yerinde olmaması durumunda bir SecurityException oluşturan güvenlik talebinin nasıl SqlClient gerçekleştirildiğini gösterir. Çıkış SecurityException , konsol penceresinde görüntülenir.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Security;
using System.Security.Permissions;

namespace PartialTrustTopic {
   public class PartialTrustHelper : MarshalByRefObject {
      public void TestConnectionOpen(string connectionString) {
         // Try to open a connection.
         using (SqlConnection connection = new SqlConnection(connectionString)) {
            connection.Open();
         }
      }
   }

   class Program {
      static void Main(string[] args) {
         TestCAS("Data Source=(local);Integrated Security=true", "Data Source=(local);Integrated Security=true;Initial Catalog=Test");
      }

      static void TestCAS(string connectString1, string connectString2) {
         // Create permission set for sandbox AppDomain.
         // This example only allows execution.
         PermissionSet permissions = new PermissionSet(PermissionState.None);
         permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

            // Create sandbox AppDomain with permission set that only allows execution,
            // and has no SqlClientPermissions.
            AppDomainSetup appDomainSetup = new AppDomainSetup();
         appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
         AppDomain firstDomain = AppDomain.CreateDomain("NoSqlPermissions", null, appDomainSetup, permissions);

         // Create helper object in sandbox AppDomain so that code can be executed in that AppDomain.
         Type helperType = typeof(PartialTrustHelper);
         PartialTrustHelper firstHelper = (PartialTrustHelper)firstDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName);

         try {
            // Attempt to open a connection in the sandbox AppDomain.
            // This is expected to fail.
            firstHelper.TestConnectionOpen(connectString1);
            Console.WriteLine("Connection opened, unexpected.");
         }
         catch (System.Security.SecurityException ex) {
            Console.WriteLine("Failed, as expected: {0}",
                ex.FirstPermissionThatFailed);

            // Uncomment the following line to see Exception details.
            // Console.WriteLine("BaseException: " + ex.GetBaseException());
         }

         // Add permission for a specific connection string.
         SqlClientPermission sqlPermission = new SqlClientPermission(PermissionState.None);
         sqlPermission.Add(connectString1, "", KeyRestrictionBehavior.AllowOnly);

         permissions.AddPermission(sqlPermission);

         AppDomain secondDomain = AppDomain.CreateDomain("OneSqlPermission", null, appDomainSetup, permissions);
         PartialTrustHelper secondHelper = (PartialTrustHelper)secondDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName);

         // Try connection open again, it should succeed now.
         try {
            secondHelper.TestConnectionOpen(connectString1);
            Console.WriteLine("Connection opened, as expected.");
         }
         catch (System.Security.SecurityException ex) {
            Console.WriteLine("Unexpected failure: {0}", ex.Message);
         }

         // Try a different connection string. This should fail.
         try {
            secondHelper.TestConnectionOpen(connectString2);
            Console.WriteLine("Connection opened, unexpected.");
         }
         catch (System.Security.SecurityException ex) {
            Console.WriteLine("Failed, as expected: {0}", ex.Message);
         }
      }
   }
}
Imports System.Data
Imports System.Data.SqlClient
Imports System.Security
Imports System.Security.Permissions

Namespace PartialTrustTopic
    Public Class PartialTrustHelper
        Inherits MarshalByRefObject
        Public Sub TestConnectionOpen(ByVal connectionString As String)
            ' Try to open a connection.
            Using connection As New SqlConnection(connectionString)
                connection.Open()
            End Using
        End Sub
    End Class

    Class Program
        Public Shared Sub Main(ByVal args As String())
            TestCAS("Data Source=(local);Integrated Security=true", "Data Source=(local);Integrated Security=true;Initial Catalog=Test")
        End Sub

        Public Shared Sub TestCAS(ByVal connectString1 As String, ByVal connectString2 As String)
            ' Create permission set for sandbox AppDomain.
            ' This example only allows execution.
            Dim permissions As New PermissionSet(PermissionState.None)
            permissions.AddPermission(New SecurityPermission(SecurityPermissionFlag.Execution))

            ' Create sandbox AppDomain with permission set that only allows execution,
            ' and has no SqlClientPermissions.
            Dim appDomainSetup As New AppDomainSetup()
            appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
            Dim firstDomain As AppDomain = AppDomain.CreateDomain("NoSqlPermissions", Nothing, appDomainSetup, permissions)

            ' Create helper object in sandbox AppDomain so that code can be executed in that AppDomain.
            Dim helperType As Type = GetType(PartialTrustHelper)
            Dim firstHelper As PartialTrustHelper = DirectCast(firstDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName), PartialTrustHelper)

            Try
                ' Attempt to open a connection in the sandbox AppDomain.
                ' This is expected to fail.
                firstHelper.TestConnectionOpen(connectString1)
                Console.WriteLine("Connection opened, unexpected.")
            Catch ex As System.Security.SecurityException

                ' Uncomment the following line to see Exception details.
                ' Console.WriteLine("BaseException: " + ex.GetBaseException());
                Console.WriteLine("Failed, as expected: {0}", ex.FirstPermissionThatFailed)
            End Try

            ' Add permission for a specific connection string.
            Dim sqlPermission As New SqlClientPermission(PermissionState.None)
            sqlPermission.Add(connectString1, "", KeyRestrictionBehavior.AllowOnly)

            permissions.AddPermission(sqlPermission)

            Dim secondDomain As AppDomain = AppDomain.CreateDomain("OneSqlPermission", Nothing, appDomainSetup, permissions)
            Dim secondHelper As PartialTrustHelper = DirectCast(secondDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName), PartialTrustHelper)

            ' Try connection open again, it should succeed now.
            Try
                secondHelper.TestConnectionOpen(connectString1)
                Console.WriteLine("Connection opened, as expected.")
            Catch ex As System.Security.SecurityException
                Console.WriteLine("Unexpected failure: {0}", ex.Message)
            End Try

            ' Try a different connection string. This should fail.
            Try
                secondHelper.TestConnectionOpen(connectString2)
                Console.WriteLine("Connection opened, unexpected.")
            Catch ex As System.Security.SecurityException
                Console.WriteLine("Failed, as expected: {0}", ex.Message)
            End Try
        End Sub
    End Class
End Namespace

Konsol penceresinde şu çıkışı görmeniz gerekir:

Failed, as expected: <IPermission class="System.Data.SqlClient.  
SqlClientPermission, System.Data, Version=2.0.0.0,
  Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1"  
  AllowBlankPassword="False">  
<add ConnectionString="Data Source=(local);Initial Catalog=  
  Northwind;Integrated Security=SSPI" KeyRestrictions=""  
KeyRestrictionBehavior="AllowOnly"/>  
</IPermission>  
  
Connection opened, as expected.  
Failed, as expected: Request failed.  

Yönetilmeyen Kodla Birlikte Çalışabilirlik

CLR dışında çalışan kod yönetilmeyen kod olarak adlandırılır. Bu nedenle, CAS gibi güvenlik mekanizmaları yönetilmeyen koda uygulanamaz. COM bileşenleri, ActiveX arabirimleri ve Windows API işlevleri yönetilmeyen kod örnekleridir. Yönetilmeyen kodu yürütürken, genel uygulama güvenliğini tehlikeye atmamanızı sağlayan özel güvenlik konuları geçerlidir. Daha fazla bilgi için bkz . Yönetilmeyen Kodla Birlikte Çalışma.

.NET Framework, COM birlikte çalışma aracılığıyla erişim sağlayarak mevcut COM bileşenlerine geriye dönük uyumluluğu da destekler. uygun COM türlerini içeri aktarmak için COM birlikte çalışma araçlarını kullanarak COM bileşenlerini bir .NET Framework uygulamasına dahil edebilirsiniz. İçeri aktarıldıktan sonra COM türleri kullanıma hazırdır. COM birlikte çalışma, derleme meta verilerini bir tür kitaplığına aktararak ve yönetilen bileşeni COM bileşeni olarak kaydederek COM istemcilerinin yönetilen koda erişmesini de sağlar. Daha fazla bilgi için bkz . Gelişmiş COM Birlikte Çalışabilirliği.

Ayrıca bkz.