Megosztás a következőn keresztül:


Főbb biztonsági fogalmak

Megjegyzés

Ez a cikk a Windowsra vonatkozik.

A ASP.NET Core-ról további információt a ASP.NET Core Security áttekintésében talál.

A .NET szerepköralapú biztonságot nyújt a mobilkódokkal kapcsolatos biztonsági problémák kezeléséhez, valamint olyan támogatás biztosításához, amely lehetővé teszi az összetevők számára, hogy meghatározzák, hogy a felhasználók milyen műveletekre jogosultak.

Típusbiztonság és biztonság

A típusbiztos kód csak a hozzáférésre jogosult memóriahelyeket éri el. (Ebben a vitafórumban a típusbiztonság kifejezetten a memóriatípus biztonságára vonatkozik, és tágabb értelemben nem tévesztendő össze a típusbiztonsággal.) A típusbiztos kód például nem tudja beolvasni egy másik objektum privát mezőiből származó értékeket. Csak jól definiált, engedélyezett módon fér hozzá a típusokhoz.

Az igény szerinti (JIT-) fordítás során egy opcionális ellenőrzési folyamat megvizsgálja a JIT által natív gépi kódba lefordítandó metódus metaadatait és közös köztes nyelvét (CIL) annak ellenőrzéséhez, hogy biztonságosak-e. Ez a folyamat kimarad, ha a kód rendelkezik engedéllyel az ellenőrzés megkerülésére. Az ellenőrzéssel kapcsolatos további információkért lásd a felügyelt végrehajtási folyamatot.

Bár a típusbiztonság ellenőrzése nem kötelező a felügyelt kód futtatásához, a típusbiztonság kulcsfontosságú szerepet játszik a szerelvény elkülönítésében és a biztonsági kényszerítésben. Ha a kód típusbiztos, a közös futtatókörnyezet teljesen el tudja különíteni az egységeket egymástól. Ez az elkülönítés biztosítja, hogy a szerelvények ne befolyásolhassák hátrányosan egymást, és növelik az alkalmazások megbízhatóságát. A típusbiztos összetevők akkor is biztonságosan futtathatók ugyanabban a folyamatban, ha különböző szinteken megbízhatók. Ha a kód nem biztonságos, nemkívánatos mellékhatások léphetnek fel. A futtatókörnyezet például nem tudja megakadályozni, hogy a felügyelt kód natív (nem felügyelt) kódba hívható be, és rosszindulatú műveleteket hajt végre. Ha a kód típusa biztonságos, a futtatókörnyezet biztonsági kényszerítési mechanizmusa biztosítja, hogy csak akkor fér hozzá a natív kódhoz, ha erre engedéllyel rendelkezik. Az összes nem típusbiztos kódrészletnek rendelkeznie kell az átadott enumerációs taggal SecurityPermissionSkipVerification a futtatáshoz.

Megjegyzés

A Code Access Security (CAS) elavult a .NET-keretrendszer és a .NET összes verziójában. A .NET legújabb verziói nem tartják tiszteletben a CAS-megjegyzéseket, és cas-okkal kapcsolatos API-k használata esetén hibákat okoznak. A fejlesztőknek alternatív módot kell keresnie a biztonsági feladatok elvégzésére.

Vezető

Az azonosított fél a felhasználó identitását és szerepkörét képviseli, és a felhasználó nevében jár el. A .NET szerepkör-alapú biztonsága háromféle principal-t támogat:

  • Az általános tagok olyan felhasználókat és szerepköröket jelölnek, amelyek függetlenek a Windows felhasználóitól és szerepköreiétől.

  • A Windows-tagok a Windows-felhasználókat és a szerepköreiket (vagy azok Windows-csoportjait) képviselik. A Windows-felhasználó megszemélyesíthet egy másik felhasználót, ami azt jelenti, hogy a felhasználó hozzáférhet egy erőforráshoz egy másik felhasználó nevében, miközben az adott felhasználóhoz tartozó identitást jeleníti meg.

  • Az egyéni tagok az adott alkalmazáshoz szükséges módon bármilyen módon meghatározhatók. Kiterjeszthetik az igazgató identitásának és szerepeinek alapfogalmait.

További információ: Fő és identitás objektumok.

Hitelesítés

A hitelesítés az a folyamat, amely során egy entitás személyazonosságát fedezik fel és ellenőrzik a felhasználó hitelesítő adatainak vizsgálatával, és ezeket az adatokat egy hatósággal szemben igazolják. A hitelesítés során beszerzett információk közvetlenül felhasználhatók a kóddal. A .NET szerepköralapú biztonság használatával is hitelesítheti az aktuális használót, és meghatározhatja, hogy engedélyezi-e az adott biztonsági entitás számára a kód elérését. Tekintse meg a WindowsPrincipal.IsInRole metódus túlterheléseit, amelyek példákat nyújtanak arra, hogyan lehet hitelesíteni az aláírót adott szerepkörökhöz. A túlterheléssel WindowsPrincipal.IsInRole(String) például megállapíthatja, hogy az aktuális felhasználó tagja-e a Rendszergazdák csoportnak.

Ma számos hitelesítési mechanizmust használnak, amelyek közül sok a .NET szerepköralapú biztonságával használható. A leggyakrabban használt mechanizmusok egyike az alapszintű, a kivonatoló, a Passport, az operációs rendszer (például az NTLM vagy a Kerberos) vagy az alkalmazás által meghatározott mechanizmusok.

Példa

Az alábbi példa megköveteli, hogy az aktív tag rendszergazda legyen. A name paraméter az null, amely lehetővé teszi, hogy a rendszergazdai jogosultságú felhasználók teljesítsék az igényt.

Megjegyzés

Windows Vista rendszerben a felhasználói fiókok felügyelete (UAC) határozza meg a felhasználó jogosultságait. Ha Tagja a Beépített rendszergazdák csoportnak, két futásidejű hozzáférési jogkivonatot kap: egy standard felhasználói hozzáférési jogkivonatot és egy rendszergazdai hozzáférési jogkivonatot. Alapértelmezés szerint a szokásos felhasználói szerepkörben van. Ahhoz, hogy végrehajtsa azt a kódot, amely megköveteli, hogy rendszergazda legyen, először emelje a jogosultságokat a standard felhasználóról a rendszergazdai jogra. Ezt az alkalmazás indításakor megteheti úgy, hogy a jobb gombbal az alkalmazás ikonra kattint, és jelzi, hogy rendszergazdaként szeretne futni.

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

Az alábbi példa bemutatja, hogyan határozható meg az főszereplő identitása és az főszereplő számára elérhető szerepkörök. Ennek a példának az egyik alkalmazása lehet annak ellenőrzése, hogy az aktuális felhasználó olyan szerepkörben van-e, amelyet engedélyez az alkalmazás használatához.

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

Engedélyezés

Az engedélyezés annak a folyamatnak a meghatározása, amely során eldől, hogy egy alany végrehajthat-e egy kért műveletet. Az engedélyezés a hitelesítés után történik, és a főszereplő identitására és szerepköreire vonatkozó információk alapján határozza meg, hogy a főszereplő milyen erőforrásokhoz férhet hozzá. A .NET szerepköralapú biztonság használatával implementálhatja az engedélyezést.

Lásd még