Temel Güvenlik Kavramları

Not

Bu makale Windows için geçerlidir.

ASP.NET Core hakkında bilgi için bkz . ASP.NET Core Güvenliğine Genel Bakış.

.NET, mobil kodla ilgili güvenlik endişelerini gidermeye yardımcı olmak ve bileşenlerin kullanıcıların ne yapmaya yetkilendirildiğini belirlemesine olanak tanıyan destek sağlamak için rol tabanlı güvenlik sunar.

Tür güvenliği ve güvenliği

Tür güvenli kod yalnızca erişim yetkisine sahip olduğu bellek konumlarına erişir. (Bu tartışma için, tür güvenliği özellikle bellek türü güvenliğini ifade eder ve daha geniş bir açıdan tür güvenliği ile karıştırılmamalıdır.) Örneğin, tür güvenli kod başka bir nesnenin özel alanlarındaki değerleri okuyamaz. Türlere yalnızca iyi tanımlanmış, izin verilebilen yollarla erişir.

Tam zamanında (JIT) derleme sırasında isteğe bağlı bir doğrulama işlemi, türün güvenli olduğunu doğrulamak için yerel makine kodunda JIT ile derlenecek yöntemin meta verilerini ve ortak ara dilini (CIL) inceler. Kodun doğrulamayı atlama izni varsa bu işlem atlanır. Doğrulama hakkında daha fazla bilgi için bkz . Yönetilen Yürütme İşlemi.

Yönetilen kodu çalıştırmak için tür güvenliğinin doğrulanması zorunlu olmasa da, tür güvenliği derleme yalıtımında ve güvenlik uygulamada önemli bir rol oynar. Kod türü güvenli olduğunda, ortak dil çalışma zamanı derlemeleri birbirinden tamamen yalıtabilir. Bu yalıtım, derlemelerin birbirini olumsuz etkilememesini ve uygulama güvenilirliğini artırmasını sağlamaya yardımcı olur. Tür açısından güvenli bileşenler, farklı düzeylerde güvenilir olsalar bile aynı işlemde güvenle yürütülebilir. Kod türü güvenli olmadığında istenmeyen yan etkiler oluşabilir. Örneğin, çalışma zamanı yönetilen kodun yerel (yönetilmeyen) koda çağrı yapmasını ve kötü amaçlı işlemler gerçekleştirmesini engelleyemez. Kod türü güvenli olduğunda, çalışma zamanının güvenlik zorlama mekanizması, yerel koda erişim izni olmadığı sürece erişmemesini sağlar. Güvenli tür olmayan tüm kodlar, çalıştırılacak geçirilen sabit listesi üyesiyle SkipVerification verilmiş SecurityPermission olmalıdı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.

Asıl

Sorumlu, bir kullanıcının kimliğini ve rolünü temsil eder ve kullanıcı adına hareket eder. .NET'te rol tabanlı güvenlik üç tür sorumluları destekler:

  • Genel sorumlular, Windows kullanıcılarından ve rollerinden bağımsız olarak var olan kullanıcıları ve rolleri temsil eder.

  • Windows sorumluları, Windows kullanıcılarını ve rollerini (veya Windows gruplarını) temsil eder. Bir Windows sorumlusu başka bir kullanıcının kimliğine bürünebilir, bu da sorumlunun o kullanıcıya ait olan kimliği sunarken kullanıcı adına bir kaynağa erişebileceği anlamına gelir.

  • Özel sorumlular, bir uygulama tarafından belirli bir uygulama için gereken herhangi bir şekilde tanımlanabilir. Sorumlunun kimliği ve rolleri ile ilgili temel kavramlarını genişletebilirler.

Daha fazla bilgi için bkz . Sorumlu ve Kimlik Nesneleri.

Kimlik Doğrulaması

Kimlik doğrulaması, kullanıcının kimlik bilgilerini inceleyerek ve bu kimlik bilgilerini bir yetkiliye karşı doğrulayarak bir sorumlunun kimliğini bulma ve doğrulama işlemidir. Kimlik doğrulaması sırasında elde edilen bilgiler kodunuz tarafından doğrudan kullanılabilir. Geçerli kullanıcının kimliğini doğrulamak ve bu sorumlunun kodununuza erişmesine izin verilip verilmeyeceğini belirlemek için .NET rol tabanlı güvenlik de kullanabilirsiniz. Belirli roller için sorumlunun WindowsPrincipal.IsInRole kimliğini doğrulama örnekleri için yönteminin aşırı yüklemelerine bakın. Örneğin, geçerli kullanıcının Yönetici istrators grubunun üyesi olup olmadığını belirlemek için aşırı yüklemeyi kullanabilirsinizWindowsPrincipal.IsInRole(String).

Günümüzde birçok kimlik doğrulama mekanizması kullanılmaktadır ve bunların çoğu .NET rol tabanlı güvenlikle kullanılabilir. En yaygın kullanılan mekanizmalardan bazıları temel, özet, Passport, işletim sistemi (NTLM veya Kerberos gibi) veya uygulama tanımlı mekanizmalardır.

Örnek

Aşağıdaki örnek, etkin sorumlunun yönetici olmasını gerektirir. name parametresi, nullyönetici olan tüm kullanıcıların talebi geçirmesine olanak tanır.

Not

Windows Vista'da Kullanıcı Hesabı Denetimi (UAC), bir kullanıcının ayrıcalıklarını belirler. Yerleşik Yöneticiler grubunun bir üyesi iseniz, size iki çalışma zamanı erişim belirteci atanır: Standart kullanıcı erişim belirteci ve yönetici erişim belirteci. Varsayılan olarak, standart kullanıcı rolünde olursunuz. Yönetici olmanız gereken kodu yürütmek için öncelikle ayrıcalıklarınızı standart kullanıcıdan yöneticiye yükseltmeniz gerekir. Uygulama simgesine sağ tıklayıp yönetici olarak çalıştırmak istediğinizi belirterek uygulamayı başlattığınızda bunu yapabilirsiniz.

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

Aşağıdaki örnekte, sorumlunun kimliğinin ve sorumlunun kullanabileceği rollerin nasıl belirleneceği gösterilmektedir. Bu örnekteki bir uygulama, geçerli kullanıcının uygulamanızı kullanmak için izin ettiğiniz bir rolde olduğunu onaylamak olabilir.

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

Yetkilendirme

Yetkilendirme, bir sorumlunun istenen eylemi gerçekleştirmesine izin verilip verilmeyeceğini belirleme işlemidir. Yetkilendirme, kimlik doğrulamasından sonra gerçekleşir ve sorumlunun erişebileceği kaynakları belirlemek için sorumlunun kimliği ve rolleri hakkındaki bilgileri kullanır. Yetkilendirmeyi uygulamak için .NET rol tabanlı güvenlik kullanabilirsiniz.

Ayrıca bkz.