Viktiga säkerhetsbegrepp

Kommentar

Den här artikeln gäller för Windows.

Information om ASP.NET Core finns i Översikt över ASP.NET Core Security.

.NET erbjuder rollbaserad säkerhet för att hjälpa till att hantera säkerhetsproblem med mobilkod och för att ge stöd som gör det möjligt för komponenter att avgöra vad användarna har behörighet att göra.

Typsäkerhet och säkerhet

Typsäker kod får endast åtkomst till de minnesplatser som den har behörighet att komma åt. (För denna diskussion avser typsäkerhet specifikt minnestypsäkerhet och bör inte förväxlas med typsäkerhet i ett bredare avseende.) Till exempel kan inte typsäker kod läsa värden från ett annat objekts privata fält. Den kommer endast åt typer på väldefinierade och tillåtna sätt.

Under jit-kompilering (just-in-time) undersöker en valfri verifieringsprocess metadata och det gemensamma mellanliggande språket (CIL) för en metod som ska JIT-kompileras till inbyggd datorkod för att verifiera att de är typsäkra. Den här processen hoppas över om koden har behörighet att kringgå verifieringen. Mer information om verifiering finns i Hanterad körningsprocess.

Även om verifiering av typsäkerhet inte är obligatorisk för att köra hanterad kod spelar typsäkerhet en avgörande roll vid monteringsisolering och säkerhetstillämpning. När koden är typsäker kan den gemensamma språkkörningen helt isolera sammansättningar från varandra. Den här isoleringen hjälper till att säkerställa att sammansättningar inte kan påverka varandra negativt och öka programmets tillförlitlighet. Typsäkra komponenter kan köras säkert i samma process även om de är betrodda på olika nivåer. När koden inte är typsäker kan oönskade biverkningar uppstå. Körningen kan till exempel inte hindra hanterad kod från att anropa intern (ohanterad) kod och utföra skadliga åtgärder. När koden är typsäker ser körningens mekanism för säkerhetstillämpning till att den inte har åtkomst till inbyggd kod om den inte har behörighet att göra det. All kod som inte är typsäker måste ha beviljats SecurityPermission med den skickade uppräkningsmedlemmen SkipVerification som ska köras.

Kommentar

Code Access Security (CAS) har föråldrats i alla versioner av .NET Framework och .NET. De senaste versionerna av .NET följer inte CAS-anteckningar och skapar fel om CAS-relaterade API:er används. Utvecklare bör söka alternativa sätt att utföra säkerhetsuppgifter.

Huvudkonto

Ett huvudnamn representerar identiteten och rollen för en användare och agerar för användarens räkning. Rollbaserad säkerhet i .NET stöder tre typer av huvudnamn:

  • Allmänna huvudnamn representerar användare och roller som finns oberoende av Windows-användare och roller.

  • Windows-huvudnamn representerar Windows-användare och deras roller (eller deras Windows-grupper). Ett Windows-huvudnamn kan personifiera en annan användare, vilket innebär att huvudkontot kan komma åt en resurs för en användares räkning samtidigt som identiteten som tillhör användaren presenteras.

  • Anpassade huvudkonton kan definieras av ett program på alla sätt som behövs för just det programmet. De kan utöka den grundläggande uppfattningen om huvudnamnets identitet och roller.

Mer information finns i Huvudobjekt och Identitetsobjekt.

Autentisering

Autentisering är processen att identifiera och verifiera identiteten för ett huvudnamn genom att undersöka användarens autentiseringsuppgifter och verifiera dessa autentiseringsuppgifter mot någon utfärdare. Den information som erhålls under autentiseringen kan användas direkt av din kod. Du kan också använda rollbaserad .NET-säkerhet för att autentisera den aktuella användaren och för att avgöra om du vill tillåta att huvudkontot får åtkomst till koden. Se överlagringarna av WindowsPrincipal.IsInRole metoden för exempel på hur du autentiserar huvudnamnet för specifika roller. Du kan till exempel använda överbelastningen WindowsPrincipal.IsInRole(String) för att avgöra om den aktuella användaren är medlem i gruppen Administratörer.

En mängd olika autentiseringsmekanismer används idag, varav många kan användas med rollbaserad säkerhet i .NET. Några av de vanligaste mekanismerna är grundläggande, sammanfattade, Passport, operativsystem (till exempel NTLM eller Kerberos) eller programdefinierade mekanismer.

Exempel

I följande exempel krävs att det aktiva huvudkontot är administratör. Parametern name är null, som gör att alla användare som är administratör kan skicka begäran.

Kommentar

I Windows Vista bestämmer UAC (User Account Control) en användares behörigheter. Om du är medlem i gruppen Inbyggda administratörer tilldelas du två åtkomsttoken för körning: en standardåtkomsttoken för användare och en administratörsåtkomsttoken. Som standard är du i standardanvändarrollen. Om du vill köra koden som kräver att du är administratör måste du först höja dina privilegier från standardanvändare till administratör. Du kan göra detta när du startar ett program genom att högerklicka på programikonen och ange att du vill köra som administratör.

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

I följande exempel visas hur du fastställer identiteten för huvudkontot och de roller som är tillgängliga för huvudkontot. Ett program i det här exemplet kan vara att bekräfta att den aktuella användaren är i en roll som du tillåter för att använda ditt program.

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

Auktorisering

Auktorisering är processen för att avgöra om ett huvudnamn tillåts utföra en begärd åtgärd. Auktorisering sker efter autentisering och använder information om huvudnamnets identitet och roller för att avgöra vilka resurser som huvudkontot kan komma åt. Du kan använda rollbaserad säkerhet i .NET för att implementera auktorisering.

Se även