Bagikan melalui


Konsep keamanan utama

Nota

Artikel ini berlaku untuk Windows.

Untuk informasi tentang ASP.NET Core, lihat Gambaran Umum ASP.NET Core Security.

.NET menawarkan keamanan berbasis peran untuk membantu mengatasi masalah keamanan tentang kode seluler dan untuk memberikan dukungan yang memungkinkan komponen menentukan apa yang diizinkan untuk dilakukan pengguna.

Jenis keselamatan dan keamanan

Kode jenis aman hanya mengakses lokasi memori yang diizinkan untuk diakses. (Untuk diskusi ini, keamanan jenis secara khusus mengacu pada keamanan jenis memori dan tidak boleh dikacaukan dengan keamanan jenis dalam arti yang lebih luas.) Misalnya, kode aman jenis tidak dapat membaca nilai dari bidang privat objek lain. Ini hanya mengakses jenis dengan cara yang telah ditentukan dan diizinkan.

Selama kompilasi just-in-time (JIT), proses verifikasi opsional memeriksa metadata dan bahasa perantara umum (CIL) dari metode yang akan dikompilasi JIT ke dalam kode mesin asli untuk memverifikasi bahwa jenisnya aman. Proses ini dilewati jika kode memiliki izin untuk melewati verifikasi. Untuk informasi selengkapnya tentang verifikasi, lihat Proses Eksekusi Terkelola.

Meskipun verifikasi keamanan jenis tidak wajib untuk menjalankan kode terkelola, keamanan jenis memainkan peran penting dalam isolasi perakitan dan penegakan keamanan. Ketika kode memiliki keamanan tipe, runtime bahasa umum dapat sepenuhnya mengisolasi assembly satu dari yang lain. Isolasi ini membantu memastikan bahwa rakitan tidak dapat berdampak buruk satu sama lain dan meningkatkan keandalan aplikasi. Komponen jenis aman dapat dijalankan dengan aman dalam proses yang sama bahkan jika mereka dipercaya pada tingkat yang berbeda. Ketika kode tidak aman, efek samping yang tidak diinginkan dapat terjadi. Misalnya, runtime tidak dapat mencegah kode terkelola memanggil kode asli (tidak terkelola) dan melakukan operasi berbahaya. Ketika kode aman, mekanisme penegakan keamanan runtime memastikan bahwa kode tersebut tidak mengakses kode asli kecuali memiliki izin untuk melakukannya. Semua kode yang tidak aman tipe harus diberi akses SecurityPermission dengan anggota enum yang sudah diteruskan SkipVerification agar dapat dijalankan.

Nota

Keamanan Akses Kode (CAS) telah 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.

Kepala sekolah

Perwakilan mewakili identitas dan peran pengguna dan bertindak atas nama pengguna. Keamanan berbasis peran di .NET mendukung tiga jenis prinsipal:

  • Prinsip generik mewakili pengguna dan peran yang tidak bergantung pada pengguna dan peran Windows.

  • Prinsipal Windows mewakili pengguna Windows dan peran mereka (atau grup Windows mereka). Perwakilan Windows dapat meniru pengguna lain, yang berarti bahwa prinsipal dapat mengakses sumber daya atas nama pengguna sambil menyajikan identitas milik pengguna tersebut.

  • Prinsip kustom dapat didefinisikan oleh aplikasi dengan cara apa pun yang diperlukan untuk aplikasi tertentu. Mereka dapat memperluas gagasan dasar tentang identitas dan peran utama.

Untuk informasi selengkapnya, lihat Utama dan Objek Identitas.

Otentikasi

Autentikasi adalah proses menemukan dan memverifikasi identitas prinsipal dengan memeriksa kredensial pengguna dan memvalidasi kredensial tersebut terhadap beberapa otoritas. Informasi yang diperoleh selama autentikasi dapat langsung digunakan oleh kode Anda. Anda juga dapat menggunakan keamanan berbasis peran .NET untuk mengautentikasi pengguna saat ini dan untuk menentukan apakah akan mengizinkan prinsipal tersebut mengakses kode Anda. Lihat kelebihan beban metode WindowsPrincipal.IsInRole untuk contoh cara mengautentikasi utama untuk peran tertentu. Misalnya, Anda dapat menggunakan kelebihan beban WindowsPrincipal.IsInRole(String) untuk menentukan apakah pengguna saat ini adalah anggota grup Administrator.

Berbagai mekanisme autentikasi digunakan saat ini, banyak di antaranya dapat digunakan dengan keamanan berbasis peran .NET. Beberapa mekanisme yang paling umum digunakan adalah mekanisme dasar, digest, Passport, sistem operasi (seperti NTLM atau Kerberos), atau mekanisme yang ditentukan oleh aplikasi.

Contoh

Contoh berikut mengharuskan prinsipal aktif menjadi administrator. Parameter name adalah null, yang memungkinkan setiap pengguna yang merupakan administrator untuk meneruskan permintaan.

Nota

Di Windows Vista, Kontrol Akun Pengguna (UAC) menentukan hak istimewa pengguna. Jika Anda adalah anggota grup Administrator Bawaan, Anda diberi dua token akses runtime: token akses pengguna standar dan token akses administrator. Secara default, Anda berada dalam peran pengguna standar. Untuk menjalankan kode yang mengharuskan Anda menjadi administrator, Anda harus terlebih dahulu meningkatkan hak istimewa Anda dari pengguna standar ke administrator. Anda dapat melakukan ini saat memulai aplikasi dengan mengklik kanan ikon aplikasi dan menunjukkan bahwa Anda ingin menjalankan sebagai administrator.

using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;

class SecurityPrincipalDemo
{

    public static void Main()
    {
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        PrincipalPermission principalPerm = new PrincipalPermission(null, "Administrators");
        principalPerm.Demand();
        Console.WriteLine("Demand succeeded.");
    }
}
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal



Class SecurityPrincipalDemo


    Public Shared Sub Main()
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
        Dim principalPerm As New PrincipalPermission(Nothing, "Administrators")
        principalPerm.Demand()
        Console.WriteLine("Demand succeeded.")

    End Sub
End Class

Contoh berikut menunjukkan cara menentukan identitas prinsipal dan peran yang tersedia untuk prinsipal. Aplikasi dari contoh ini mungkin untuk mengonfirmasi bahwa pengguna saat ini berada dalam peran yang Anda izinkan untuk menggunakan aplikasi Anda.

using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;

class SecurityPrincipalDemo
{
    public static void DemonstrateWindowsBuiltInRoleEnum()
    {
        AppDomain myDomain = Thread.GetDomain();

        myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
        Console.WriteLine($"{myPrincipal.Identity.Name.ToString()} belongs to: ");
        Array wbirFields = Enum.GetValues(typeof(WindowsBuiltInRole));
        foreach (object roleName in wbirFields)
        {
            try
            {
                // Cast the role name to a RID represented by the WindowsBuildInRole value.
                Console.WriteLine($"{roleName}? {myPrincipal.IsInRole((WindowsBuiltInRole)roleName)}.");
                Console.WriteLine("The RID for this role is: " + ((int)roleName).ToString());
            }
            catch (Exception)
            {
                Console.WriteLine($"{roleName}: Could not obtain role for this RID.");
            }
        }
        // Get the role using the string value of the role.
        Console.WriteLine($"'Administrators'? {myPrincipal.IsInRole("BUILTIN\\" + "Administrators")}.");
        Console.WriteLine($"'Users'? {myPrincipal.IsInRole("BUILTIN\\" + "Users")}.");
        // Get the role using the WindowsBuiltInRole enumeration value.
        Console.WriteLine($"{WindowsBuiltInRole.Administrator}? {myPrincipal.IsInRole(WindowsBuiltInRole.Administrator)}.");
        // Get the role using the WellKnownSidType.
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
        Console.WriteLine($"WellKnownSidType BuiltinAdministratorsSid  {sid.Value}? {myPrincipal.IsInRole(sid)}.");
    }

    public static void Main()
    {
        DemonstrateWindowsBuiltInRoleEnum();
    }
}
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal

Class SecurityPrincipalDemo

    Public Shared Sub DemonstrateWindowsBuiltInRoleEnum()
        Dim myDomain As AppDomain = Thread.GetDomain()

        myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
        Dim myPrincipal As WindowsPrincipal = CType(Thread.CurrentPrincipal, WindowsPrincipal)
        Console.WriteLine("{0} belongs to: ", myPrincipal.Identity.Name.ToString())
        Dim wbirFields As Array = [Enum].GetValues(GetType(WindowsBuiltInRole))
        Dim roleName As Object
        For Each roleName In wbirFields
            Try
                ' Cast the role name to a RID represented by the WindowsBuildInRole value.
                Console.WriteLine("{0}? {1}.", roleName, myPrincipal.IsInRole(CType(roleName, WindowsBuiltInRole)))
                Console.WriteLine("The RID for this role is: " + Fix(roleName).ToString())

            Catch
                Console.WriteLine("{0}: Could not obtain role for this RID.", roleName)
            End Try
        Next roleName
        ' Get the role using the string value of the role.
        Console.WriteLine("{0}? {1}.", "Administrators", myPrincipal.IsInRole("BUILTIN\" + "Administrators"))
        Console.WriteLine("{0}? {1}.", "Users", myPrincipal.IsInRole("BUILTIN\" + "Users"))
        ' Get the role using the WindowsBuiltInRole enumeration value.
        Console.WriteLine("{0}? {1}.", WindowsBuiltInRole.Administrator, myPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
        ' Get the role using the WellKnownSidType.
        Dim sid As New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing)
        Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid  {0}? {1}.", sid.Value, myPrincipal.IsInRole(sid))

    End Sub

    Public Shared Sub Main()
        DemonstrateWindowsBuiltInRoleEnum()

    End Sub
End Class

Otorisasi

Otorisasi adalah proses penentuan apakah perwakilan diizinkan untuk melakukan tindakan yang diminta. Otorisasi terjadi setelah autentikasi dan menggunakan informasi tentang identitas dan peran utama untuk menentukan sumber daya apa yang dapat diakses oleh prinsipal. Anda dapat menggunakan keamanan berbasis peran .NET untuk menerapkan otorisasi.

Lihat juga