Keamanan Akses Kode dan ADO.NET

.NET Framework menawarkan keamanan berbasis peran serta keamanan akses kode (CAS), yang keduanya diimplementasikan menggunakan infrastruktur umum yang disediakan oleh runtime bahasa umum (CLR). Dalam dunia kode yang tidak dikelola, sebagian besar aplikasi dijalankan dengan izin pengguna atau prinsipal. Akibatnya, sistem komputer dapat rusak dan data pribadi disusupi ketika perangkat lunak berbahaya atau yang berisi kesalahan dijalankan oleh pengguna dengan hak istimewa yang lebih tinggi.

Sebaliknya, kode terkelola yang dijalankan di .NET Framework mencakup keamanan akses kode, yang berlaku untuk kode saja. Apakah kode diizinkan untuk berjalan atau tidak tergantung pada asal kode atau aspek lain dari identitas kode, bukan hanya identitas utama. Ini mengurangi kemungkinan kode terkelola dapat disalahgunakan.

Catatan

Keamanan Akses Kode (CAS) tidak digunakan lagi di semua versi .NET Framework dan .NET. Versi terbaru .NET tidak mematuhi anotasi CAS dan menghasilkan kesalahan jika API terkait CAS digunakan. Pengembang harus mencari cara alternatif untuk menyelesaikan tugas keamanan.

Izin Akses Kode

Ketika kode dijalankan, kode menyajikan bukti yang dievaluasi oleh sistem keamanan CLR. Biasanya, bukti ini terdiri dari asal kode termasuk URL, situs, dan zona, serta tanda tangan digital yang memastikan identitas rakitan.

CLR memungkinkan kode untuk hanya melakukan operasi yang memiliki izin untuk dilakukan oleh kode. Kode dapat meminta izin, dan permintaan tersebut dipenuhi berdasarkan kebijakan keamanan yang ditetapkan oleh administrator.

Catatan

Kode yang dijalankan di CLR tidak dapat memberikan izin kepada dirinya sendiri. Misalnya, kode dapat meminta dan diberikan lebih sedikit izin daripada yang diizinkan oleh kebijakan keamanan, tetapi tidak akan pernah diberikan lebih banyak izin. Saat memberikan izin, mulailah tanpa izin sama sekali, lalu tambahkan izin tersempit untuk tugas tertentu yang sedang dilakukan. Memulai dengan semua izin, lalu menolak satu per satu menyebabkan aplikasi tidak aman yang mungkin berisi lubang keamanan yang tidak disengaja dari pemberian izin lebih dari yang diperlukan. Untuk informasi lebih lanjut, lihat Mengonfigurasi Kebijakan Keamanan dan Pengelolaan Kebijakan Keamanan.

Ada tiga jenis izin akses kode:

  • Code access permissions berasal dari kelas CodeAccessPermission. Izin diperlukan untuk mengakses sumber daya yang dilindungi, seperti file dan variabel lingkungan, serta untuk melakukan operasi yang dilindungi, seperti mengakses kode yang tidak dikelola.

  • Identity permissions mewakili karakteristik yang mengidentifikasi rakitan. Izin diberikan ke rakitan berdasarkan bukti, yang dapat mencakup item seperti tanda tangan digital atau tempat kode berasal. Izin identitas juga berasal dari kelas dasar CodeAccessPermission.

  • Role-based security permissions didasarkan pada apakah prinsipal memiliki identitas tertentu atau merupakan anggota dari peran tertentu. Kelas PrincipalPermission memungkinkan pemeriksaan izin deklaratif dan imperatif terhadap prinsipal aktif.

Untuk menentukan apakah kode diotorisasi untuk mengakses sumber daya atau melakukan operasi, sistem keamanan runtime melintasi tumpukan panggilan, membandingkan izin yang diberikan dari setiap pemanggil dengan izin yang diminta. Jika ada pemanggil di tumpukan panggilan tidak memiliki izin yang diminta, SecurityException dilemparkan dan akses ditolak.

Meminta Izin

Tujuan meminta izin adalah untuk menginformasikan waktu proses izin mana yang diperlukan aplikasi Anda untuk dijalankan, dan untuk memastikan bahwa aplikasi hanya menerima izin yang benar-benar dibutuhkan. Misalnya, jika aplikasi Anda perlu menulis data ke disk lokal, aplikasi memerlukan FileIOPermission. Jika izin tersebut belum diberikan, aplikasi akan gagal ketika mencoba menulis ke disk. Namun, jika aplikasi meminta FileIOPermission dan izin tersebut belum diberikan, aplikasi akan menghasilkan pengecualian di awal dan tidak akan dimuat.

Dalam skenario ketika aplikasi hanya perlu membaca data dari disk, Anda dapat meminta agar aplikasi tidak pernah diberikan izin tulis apa pun. Jika terjadi bug atau serangan berbahaya, kode Anda tidak dapat merusak data tempatnya beroperasi. Untuk informasi lebih lanjut, baca Meminta Izin.

Keamanan Berbasis Peran dan CAS

Menerapkan keamanan berbasis peran dan keamanan yang diakses kode (CAS) meningkatkan keamanan keseluruhan untuk aplikasi Anda. Keamanan berbasis peran dapat didasarkan pada akun Windows atau identitas kustom, membuat informasi tentang prinsipal keamanan tersedia untuk utas saat ini. Selain itu, aplikasi sering diperlukan untuk menyediakan akses ke data atau sumber daya berdasarkan kredensial yang disediakan oleh pengguna. Biasanya, aplikasi tersebut memeriksa peran pengguna dan menyediakan akses ke sumber daya berdasarkan peran tersebut.

Keamanan berbasis peran memungkinkan komponen mengidentifikasi pengguna saat ini dan peran terkait mereka saat runtime. Informasi ini kemudian dipetakan menggunakan kebijakan CAS untuk menentukan sekumpulan izin yang diberikan saat run time. Untuk domain aplikasi tertentu, host dapat mengubah kebijakan keamanan berbasis peran default dan menetapkan prinsipal keamanan default yang mewakili pengguna dan peran yang terkait dengan pengguna tersebut.

CLR menggunakan izin untuk menerapkan mekanismenya untuk memberlakukan pembatasan pada kode terkelola. Izin keamanan berbasis peran menyediakan mekanisme untuk menemukan apakah pengguna (atau agen yang bertindak atas nama pengguna) memiliki identitas tertentu atau merupakan anggota dari peran tertentu. Untuk informasi lebih lanjut, lihat Izin Keamanan.

Bergantung pada jenis aplikasi yang Anda bangun, Anda juga harus mempertimbangkan untuk menerapkan izin berbasis peran dalam database. Untuk informasi lebih lanjut tentang keamanan berbasis peran di SQL Server, lihat Keamanan SQL Server.

Rakitan

Rakitan membentuk unit dasar penyebaran, kontrol versi, penggunaan kembali, pelingkupan aktivasi, dan izin keamanan untuk aplikasi .NET Framework. Rakitan menyediakan kumpulan jenis dan sumber daya yang dibangun untuk bekerja bersama dan membentuk unit fungsionalitas logis. Untuk CLR, jenis tidak ada di luar konteks rakitan. Untuk informasi lebih lanjut tentang membuat dan menyebarkan rakitan, lihat Pemrograman dengan Rakitan.

Rakitan penamaan yang kuat

Nama kuat, atau tanda tangan digital, terdiri dari identitas rakitan, yang mencakup nama teks sederhana, nomor versi, dan informasi budaya (jika disediakan), ditambah kunci publik dan tanda tangan digital. Tanda tangan digital dihasilkan dari file rakitan menggunakan kunci privat yang sesuai. File assembly berisi manifes assembly, yang berisi nama dan hash dari semua file yang membentuk assembly.

Penamaan rakitan yang kuat memberi aplikasi atau komponen identitas unik yang dapat digunakan perangkat lunak lain untuk merujuk secara eksplisit ke dalamnya. Rakitan penjaga penamaan yang kuat agar tidak dipalsukan oleh rakitan yang berisi kode bermusuhan. Penamaan yang kuat juga memastikan konsistensi penerapan versi di antara berbagai versi komponen. Anda harus memiliki rakitan nama yang kuat yang akan disebarkan ke Cache Rakitan Global (GAC). Untuk informasi selengkapnya, lihat Membuat dan Menggunakan Rakitan dengan Nama yang Kuat.

Kepercayaan Parsial pada ADO.NET 2.0

Di ADO.NET 2.0, Penyedia Data .NET Framework untuk SQL Server, Penyedia Data .NET Framework untuk OLE DB, Penyedia Data .NET Framework untuk ODBC, dan Penyedia Data .NET Framework untuk Oracle sekarang semuanya dapat berjalan dalam lingkungan yang dipercayai secara parsial. Dalam rilis .NET Framework sebelumnya, hanya System.Data.SqlClient didukung dalam aplikasi yang kurang dari kepercayaan penuh.

Minimal, aplikasi yang dipercayai secara parsial yang menggunakan penyedia SQL Server harus memiliki izin eksekusi dan SqlClientPermission.

Properti Atribut Izin untuk Kepercayaan Parsial

Untuk skenario kepercayaan parsial, Anda dapat menggunakan anggota SqlClientPermissionAttribute untuk lebih membatasi kemampuan yang tersedia untuk Penyedia Data .NET Framework untuk SQL Server.

Tabel berikut mencantumkan properti SqlClientPermissionAttribute yang tersedia dan deskripsinya:

Properti atribut izin Deskripsi
Action Mendapatkan atau mengatur tindakan keamanan. Diperoleh dari SecurityAttribute.
AllowBlankPassword Mengaktifkan atau menonaktifkan penggunaan kata sandi kosong dalam string koneksi. Nilai yang valid adalah true (untuk mengaktifkan penggunaan sandi kosong) dan false (untuk menonaktifkan penggunaan sandi kosong). Diperoleh dari DBDataPermissionAttribute.
ConnectionString Mengidentifikasi string koneksi yang diizinkan. Beberapa string koneksi dapat diidentifikasi. Catatan: Jangan sertakan ID pengguna atau kata sandi dalam rangkaian koneksi Anda. Dalam rilis ini, Anda tidak dapat mengubah batasan string koneksi menggunakan Alat Konfigurasi .NET Framework.

Diperoleh dari DBDataPermissionAttribute.
KeyRestrictions Mengidentifikasi parameter string koneksi yang diizinkan atau tidak diizinkan. Parameter string koneksi diidentifikasi dalam bentuk <nama parameter>=. Beberapa parameter dapat ditentukan, dibatasi menggunakan titik koma (;). Catatan: Jika Anda tidak menentukan KeyRestrictions, tetapi Anda mengatur properti KeyRestrictionBehavior ke AllowOnly atau PreventUsage, tidak ada parameter string koneksi tambahan yang diizinkan. Diperoleh dari DBDataPermissionAttribute.
KeyRestrictionBehavior Mengidentifikasi parameter string koneksi sebagai satu-satunya parameter tambahan yang diizinkan (AllowOnly), atau mengidentifikasi parameter tambahan yang tidak diizinkan (PreventUsage). AllowOnly adalah defaultnya. Diperoleh dari DBDataPermissionAttribute.
TypeID Mendapatkan pengidentifikasi unik untuk atribut ini saat diimplementasikan di kelas turunan. Diperoleh dari Attribute.
Unrestricted Menunjukkan apakah izin tidak terbatas ke sumber daya dideklarasikan. Diperoleh dari SecurityAttribute.

Sintaks ConnectionString

Contoh berikut menunjukkan cara menggunakan elemen connectionStrings dari file konfigurasi untuk mengizinkan hanya string koneksi tertentu yang akan digunakan. Lihat String Koneksi untuk informasi lebih lanjut tentang menyimpan dan mengambil string koneksi dari file konfigurasi.

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

Sintaks KeyRestrictions

Contoh berikut mengaktifkan string koneksi yang sama, mengaktifkan penggunaan opsi string koneksi Encrypt dan Packet Size, tetapi membatasi penggunaan opsi string koneksi lainnya.

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

KeyRestrictionBehavior dengan Sintaks PreventUsage

Contoh berikut mengaktifkan string koneksi yang sama dan mengizinkan semua parameter koneksi lainnya kecuali untuk User Id, Password, dan Persist Security Info.

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

Perilaku Pembatasan Kunci dengan Sintaks AllowOnly

Contoh berikut mengaktifkan dua string koneksi yang juga berisi parameter Initial Catalog, Connection Timeout, Encrypt, dan Packet Size. Semua parameter string koneksi lainnya dibatasi.

<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>  

Mengaktifkan Kepercayaan Parsial dengan Kumpulan Izin Kustom

Untuk mengaktifkan penggunaan izin System.Data.SqlClient untuk zona tertentu, administrator sistem harus membuat kumpulan izin khusus dan menetapkannya sebagai kumpulan izin untuk zona tertentu. Kumpulan izin default, seperti LocalIntranet, tidak dapat diubah. Misalnya, untuk menyertakan izin System.Data.SqlClient untuk kode yang memiliki Zone dari LocalIntranet, administrator sistem dapat menyalin kumpulan izin untuk LocalIntranet, mengganti namanya menjadi "CustomLocalIntranet", menambahkan izin System.Data.SqlClient, mengimpor izin kumpulan CustomLocalIntranet menggunakan Caspol.exe (Alat Kebijakan Keamanan Akses Kode), dan mengatur kumpulan izin LocalIntranet_Zone ke CustomLocalIntranet.

Kumpulan Izin Sampel

Berikut ini adalah izin sampel yang ditetapkan untuk Penyedia Data .NET Framework untuk SQL Server dalam skenario yang dipercayai secara parsial. Untuk informasi tentang membuat kumpulan izin khusus, lihat Mengonfigurasi Kumpulan Izin Menggunakan Caspol.exe.

<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>  

Memverifikasi Akses Kode ADO.NET Menggunakan Izin Keamanan

Untuk skenario kepercayaan parsial, Anda dapat memerlukan hak istimewa CAS untuk metode tertentu dalam kode Anda dengan menentukan SqlClientPermissionAttribute. Jika hak istimewa tersebut tidak diizinkan oleh kebijakan keamanan terbatas yang berlaku, pengecualian akan dilemparkan sebelum kode Anda dijalankan. Untuk informasi lebih lanjut tentang kebijakan keamanan, lihat Manajemen Kebijakan Keamanan dan Praktik Terbaik Kebijakan Keamanan.

Contoh

Contoh berikut menunjukkan cara menulis kode yang memerlukan string koneksi tertentu. Ini menyimulasikan penolakan izin tak terbatas untuk System.Data.SqlClient, yang akan diterapkan oleh administrator sistem menggunakan kebijakan CAS di dunia nyata.

Penting

Saat merancang izin CAS untuk ADO.NET, pola yang benar adalah mulai dengan kasus yang paling ketat (tidak ada izin sama sekali), lalu tambahkan izin khusus yang diperlukan untuk tugas tertentu yang perlu dilakukan oleh kode. Pola yang berlawanan, memulai dengan semua izin, lalu menolak izin tertentu, tidak aman karena ada banyak cara untuk mengekspresikan string koneksi yang sama. Misalnya, jika Anda memulai dengan semua izin, lalu mencoba menolak penggunaan string koneksi "server=someserver", string "server=someserver.mycompany.com" akan tetap diizinkan. Dengan selalu memulai dengan tidak memberikan izin sama sekali, Anda mengurangi kemungkinan ada lubang dalam kumpulan izin.

Kode berikut menunjukkan bagaimana SqlClient melakukan permintaan keamanan, yang memunculkan SecurityException jika izin CAS yang sesuai tidak ada. Output SecurityException ditampilkan di jendela konsol.

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

Anda akan melihat output ini di jendela Konsol:

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.  

Interoperabilitas dengan Kode Tak Terkelola

Kode yang berjalan di luar CLR disebut kode tak terkelola. Oleh karena itu, mekanisme keamanan seperti CAS tidak dapat diterapkan ke kode tak terkelola. Komponen COM, antarmuka ActiveX, dan fungsi Windows API adalah contoh kode tak terkelola. Pertimbangan keamanan khusus berlaku saat menjalankan kode tak terkelola sehingga Anda tidak membahayakan keamanan aplikasi secara keseluruhan. Untuk informasi selengkapnya, lihat Mengoperasikan dengan Kode Tidak Terkelola.

.NET Framework juga mendukung kompatibilitas mundur ke komponen COM yang ada dengan menyediakan akses melalui interop COM. Anda dapat memasukkan komponen COM ke dalam aplikasi .NET Framework dengan menggunakan alat interop COM untuk mengimpor jenis COM yang relevan. Setelah diimpor, jenis COM siap digunakan. Interop COM juga memungkinkan klien COM mengakses kode terkelola dengan mengekspor metadata rakitan ke pustaka jenis dan mendaftarkan komponen terkelola sebagai komponen COM. Untuk informasi lebih lanjut, lihat Interoperabilitas COM Tingkat Lanjut.

Lihat juga