Share via


Belangrijke beveiligingsconcepten

Notitie

Dit artikel is van toepassing op Windows.

Zie Overzicht van ASP.NET Core Security voor informatie over ASP.NET Core.

.NET biedt beveiliging op basis van rollen om beveiligingsproblemen over mobiele code te verhelpen en ondersteuning te bieden waarmee onderdelen kunnen bepalen wat gebruikers mogen doen.

Type veiligheid en beveiliging

Typeveilige code krijgt alleen toegang tot de geheugenlocaties die zijn geautoriseerd voor toegang. (Voor deze discussie verwijst typeveiligheid specifiek naar de veiligheid van het geheugentype en mag niet worden verward met typeveiligheid in een breder kader.) Typveilige code kan bijvoorbeeld geen waarden lezen uit de privévelden van een ander object. Het heeft alleen toegang tot typen op goed gedefinieerde, toegestane manieren.

Tijdens JIT-compilatie (Just-In-Time) onderzoekt een optioneel verificatieproces de metagegevens en de algemene tussentaal (CIL) van een methode die moet worden gecompileerd in systeemeigen computercode om te controleren of deze veilig zijn. Dit proces wordt overgeslagen als de code gemachtigd is om verificatie te omzeilen. Zie Het beheerde uitvoeringsproces voor meer informatie over verificatie.

Hoewel verificatie van typeveiligheid niet verplicht is om beheerde code uit te voeren, speelt de veiligheid van het type een cruciale rol bij isolatie van assembly's en het afdwingen van beveiliging. Wanneer code veilig is, kan de algemene taalruntime assembly's volledig van elkaar isoleren. Deze isolatie helpt ervoor te zorgen dat assembly's elkaar niet nadelig beïnvloeden en de betrouwbaarheid van toepassingen verhoogt. Typeveilige onderdelen kunnen veilig worden uitgevoerd in hetzelfde proces, zelfs als ze op verschillende niveaus worden vertrouwd. Wanneer code niet veilig is, kunnen ongewenste bijwerkingen optreden. De runtime kan bijvoorbeeld niet voorkomen dat beheerde code wordt aangeroepen in systeemeigen (onbeheerde) code en schadelijke bewerkingen uitvoert. Wanneer code veilig is, zorgt het beveiligings afdwingingsmechanisme van de runtime ervoor dat deze geen toegang krijgt tot systeemeigen code, tenzij deze gemachtigd is om dit te doen. Alle code die niet het type veilig is, moet zijn verleend SecurityPermission met het doorgegeven enum-lid SkipVerification dat moet worden uitgevoerd.

Notitie

Cas (Code Access Security) is afgeschaft in alle versies van .NET Framework en .NET. Recente versies van .NET respecteren geen CAS-aantekeningen en produceren fouten als CAS-gerelateerde API's worden gebruikt. Ontwikkelaars moeten alternatieve manieren zoeken om beveiligingstaken uit te voeren.

Principal

Een principal vertegenwoordigt de identiteit en rol van een gebruiker en handelt namens de gebruiker. Beveiliging op basis van rollen in .NET ondersteunt drie soorten principals:

  • Algemene principals vertegenwoordigen gebruikers en rollen die onafhankelijk van Windows-gebruikers en -rollen bestaan.

  • Windows-principals vertegenwoordigen Windows-gebruikers en hun rollen (of hun Windows-groepen). Een Windows-principal kan een andere gebruiker imiteren, wat betekent dat de principal namens een gebruiker toegang heeft tot een resource terwijl de identiteit van die gebruiker wordt weergegeven.

  • Aangepaste principals kunnen worden gedefinieerd door een toepassing op elke manier die nodig is voor die specifieke toepassing. Ze kunnen het basisconcept van de identiteit en rollen van de principal uitbreiden.

Zie Principal- en Identity Objects voor meer informatie.

Verificatie

Verificatie is het proces van het detecteren en verifiëren van de identiteit van een principal door de referenties van de gebruiker te onderzoeken en deze referenties te valideren tegen een bepaalde instantie. De informatie die tijdens de verificatie wordt verkregen, kan rechtstreeks worden gebruikt door uw code. U kunt ook beveiliging op basis van .NET-rollen gebruiken om de huidige gebruiker te verifiëren en om te bepalen of die principal toegang moet krijgen tot uw code. Bekijk de overbelastingen van de WindowsPrincipal.IsInRole methode voor voorbeelden van het verifiëren van de principal voor specifieke rollen. U kunt bijvoorbeeld de WindowsPrincipal.IsInRole(String) overbelasting gebruiken om te bepalen of de huidige gebruiker lid is van de groep Beheer istrators.

Er worden tegenwoordig verschillende verificatiemechanismen gebruikt, waarvan er veel kunnen worden gebruikt met beveiliging op basis van .NET-rollen. Een aantal van de meest gebruikte mechanismen zijn basismechanismen, digest, Passport, besturingssysteem (zoals NTLM of Kerberos) of door toepassingen gedefinieerde mechanismen.

Opmerking

In het volgende voorbeeld moet de actieve principal een beheerder zijn. De name parameter is null, waarmee elke gebruiker die een beheerder is, de vraag kan doorgeven.

Notitie

In Windows Vista bepaalt UAC (User Account Control) de bevoegdheden van een gebruiker. Als u lid bent van de ingebouwde groep Beheer istrators, worden twee runtime-toegangstokens toegewezen: een standaardtoegangstoken voor gebruikers en een toegangstoken voor beheerders. Standaard hebt u de standaardgebruikersrol. Als u de code wilt uitvoeren waarvoor u een beheerder moet zijn, moet u eerst uw bevoegdheden verhogen van de standaardgebruiker naar de beheerder. U kunt dit doen wanneer u een toepassing start door met de rechtermuisknop op het toepassingspictogram te klikken en aan te geven dat u wilt uitvoeren als beheerder.

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

In het volgende voorbeeld ziet u hoe u de identiteit van de principal en de rollen kunt bepalen die beschikbaar zijn voor de principal. Een toepassing van dit voorbeeld kan zijn om te bevestigen dat de huidige gebruiker een rol heeft die u toestaat voor het gebruik van uw toepassing.

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

Autorisatie

Autorisatie is het proces om te bepalen of een principal een aangevraagde actie mag uitvoeren. Autorisatie vindt plaats na verificatie en gebruikt informatie over de identiteit en rollen van de principal om te bepalen tot welke resources de principal toegang heeft. U kunt beveiliging op basis van .NET-rollen gebruiken om autorisatie te implementeren.

Zie ook