Share via


Konsep Keamanan Utama

Catatan

Artikel ini berlaku untuk Windows.

Untuk informasi tentang ASP.NET Core, lihat Gambaran umum Keamanan ASP.NET Core.

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

Keselamatan dan keamanan jenis

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 disamakan dengan keamanan jenis dalam hal yang lebih luas.) Misalnya, kode jenis keamanan tidak dapat membaca nilai dari bidang privat objek lain. Ini mengakses jenis hanya dengan cara yang didefinisikan dengan baik 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 dilompati jika kode memiliki izin untuk melewati verifikasi. Untuk informasi lebih lanjut tentang verifikasi, lihat Proses Eksekusi Terkelola.

Meskipun verifikasi keamanan jenis tidak wajib untuk menjalankan kode terkelola, keamanan jenis memainkan peran penting dalam isolasi rakitan dan penegakan keamanan. Ketika kode adalah jenis keamanan, runtime bahasa umum dapat sepenuhnya mengisolasi rakitan satu sama lain. Isolasi ini membantu memastikan bahwa rakitan tidak dapat saling mempengaruhi dan meningkatkan keandalan aplikasi. Komponen jenis keamanan dapat dieksekusi dengan aman dalam proses yang sama meskipun dipercaya pada level yang berbeda. Ketika kode bukan jenis keamanan, 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 adalah jenis keamanan, mekanisme penegakan keamanan runtime memastikan bahwa kode tersebut tidak mengakses kode asli kecuali memiliki izin untuk melakukannya. Semua kode yang bukan tipe keamanan harus diberi SecurityPermission dengan anggota enum yang diteruskan SkipVerification untuk dijalankan.

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.

Utama

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

  • Prinsip generik mewakili pengguna dan peran yang independen dari pengguna dan peran Windows.

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

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

Untuk informasi lebih lanjut, lihat Objek Prinsipal dan Identitas.

Autentikasi

Autentikasi adalah proses menemukan dan memverifikasi identitas prinsipal dengan memeriksa kredensial pengguna dan memvalidasi kredensial tersebut terhadap beberapa otoritas. Informasi yang diperoleh selama autentikasi langsung dapat 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 overload dari metode WindowsPrincipal.IsInRole untuk contoh cara mengautentikasi prinsipal untuk peran tertentu. Misalnya, Anda dapat menggunakan overload 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, hash, Paspor, sistem operasi (seperti NTLM atau Kerberos), atau mekanisme yang ditentukan aplikasi.

Contoh

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

Catatan

Di Windows Vista, Kontrol Akun Pengguna (UAC) menentukan hak istimewa pengguna. Jika Anda adalah anggota grup Administrator Bawaan, Anda diberi dua token akses run-time: 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 menjadi administrator. Anda dapat melakukan ini saat memulai aplikasi dengan mengeklik kanan ikon aplikasi dan menunjukkan bahwa Anda ingin menjalankan sebagai administrator.

using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
using namespace System::Security::Policy;
using namespace System::Security::Principal;

int main(array<System::String ^> ^args)
{
    System::String^ null;
    AppDomain::CurrentDomain->SetPrincipalPolicy(PrincipalPolicy::WindowsPrincipal);
    PrincipalPermission^ principalPerm = gcnew PrincipalPermission(null, "Administrators" );
      principalPerm->Demand();
      Console::WriteLine("Demand succeeded");
    return 0;
}
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 contoh ini mungkin untuk mengonfirmasi bahwa pengguna saat ini berada dalam peran yang Anda izinkan untuk menggunakan aplikasi Anda.

public:
   static void DemonstrateWindowsBuiltInRoleEnum()
   {
      AppDomain^ myDomain = Thread::GetDomain();

      myDomain->SetPrincipalPolicy( PrincipalPolicy::WindowsPrincipal );
      WindowsPrincipal^ myPrincipal = dynamic_cast<WindowsPrincipal^>(Thread::CurrentPrincipal);

      Console::WriteLine( "{0} belongs to: ", myPrincipal->Identity->Name );

      Array^ wbirFields = Enum::GetValues( WindowsBuiltInRole::typeid );

      for each ( Object^ roleName in wbirFields )
      {
         try
         {
            Console::WriteLine( "{0}? {1}.", roleName,
               myPrincipal->IsInRole(  *dynamic_cast<WindowsBuiltInRole^>(roleName) ) );
         }
         catch ( Exception^ ) 
         {
            Console::WriteLine( "{0}: Could not obtain role for this RID.",
               roleName );
         }
      }
   }
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("{0} belongs to: ", myPrincipal.Identity.Name.ToString());
        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("{0}? {1}.", roleName,
                    myPrincipal.IsInRole((WindowsBuiltInRole)roleName));
                Console.WriteLine("The RID for this role is: " + ((int)roleName).ToString());
            }
            catch (Exception)
            {
                Console.WriteLine("{0}: Could not obtain role for this RID.",
                    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.
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
        Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid  {0}? {1}.", 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

Authorization

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

Lihat juga