Основные понятия безопасностиKey Security Concepts

Microsoft .NET Framework предлагает безопасность на основе ролей для решения проблем безопасности, связанных с мобильным кодом, и предоставления поддержки, которая позволяет компонентам определять, какие пользователи авторизованы для выполнения действий.The Microsoft .NET Framework offers role-based security to help address security concerns about mobile code and to provide support that enables components to determine what users are authorized to do.

Безопасность типа и безопасностьType safety and security

Код с безопасностью типа имеет доступ только к областям памяти, авторизованным для доступа.Type-safe code accesses only the memory locations it is authorized to access. (В данном разделе безопасность типа относится исключительно к безопасности типа памяти, и ее не следует путать с безопасностью типа в широком смысле.) Например, код с безопасностью типа не может читать значения из закрытых полей другого объекта.(For this discussion, type safety specifically refers to memory type safety and should not be confused with type safety in a broader respect.) For example, type-safe code cannot read values from another object's private fields. Он обращается к типам только строго определенными, допустимыми способами.It accesses types only in well-defined, allowable ways.

Во время JIT-компиляции дополнительный процесс проверки проверяет метаданные и MSIL метода для JIT-компиляции в машинный код, чтобы убедиться, что они являются типобезопасными.During just-in-time (JIT) compilation, an optional verification process examines the metadata and Microsoft intermediate language (MSIL) of a method to be JIT-compiled into native machine code to verify that they are type safe. Этот процесс не выполняется, если код имеет разрешение на пропуск проверки.This process is skipped if the code has permission to bypass verification. Дополнительные сведения о проверке см. в разделе Процесс управляемого выполнения.For more information about verification, see Managed Execution Process.

Хотя проверка безопасности типа не обязательна для запуска управляемого кода, безопасность типа играет ключевую роль в изоляции сборок и обеспечении безопасности.Although verification of type safety is not mandatory to run managed code, type safety plays a crucial role in assembly isolation and security enforcement. Если код является типобезопасным, среда CLR может полностью изолировать сборки друг от друга.When code is type safe, the common language runtime can completely isolate assemblies from each other. Эта изоляция помогает обеспечить отсутствие отрицательного влияния сборок друг на друга и повышает надежность приложений.This isolation helps ensure that assemblies cannot adversely affect each other and it increases application reliability. Компоненты с безопасностью типа могут безопасно выполняться в одном процессе, даже если они имеют доверие на разных уровнях.Type-safe components can execute safely in the same process even if they are trusted at different levels. Если код не является типобезопасным, могут возникать нежелательные побочные эффекты.When code is not type safe, unwanted side effects can occur. Например, среда выполнения не может препятствовать вызову машинного (неуправляемого) кода со стороны управляемого кода и выполнению управляемым кодом нежелательных операций.For example, the runtime cannot prevent managed code from calling into native (unmanaged) code and performing malicious operations. Если код является типобезопасным, механизм обеспечения безопасности среды выполнения гарантирует, что он не будет иметь доступ к машинному коду при отсутствии соответствующего разрешения.When code is type safe, the runtime's security enforcement mechanism ensures that it does not access native code unless it has permission to do so. Чтобы код без безопасности типа мог запускаться, ему необходимо предоставить разрешение SecurityPermission с переданным элементом перечисления SkipVerification.All code that is not type safe must have been granted SecurityPermission with the passed enum member SkipVerification to run.

Дополнительные сведения см. в разделе Основы управления доступом для кода.For more information, see Code Access Security Basics.

УчастникPrincipal

Участник представляет удостоверение и роль пользователя и действует от имени пользователя.A principal represents the identity and role of a user and acts on the user's behalf. Безопасность на основе ролей в .NET Framework поддерживает три вида участников.Role-based security in the .NET Framework supports three kinds of principals:

  • Универсальные участники представляют пользователей и роли, которые существуют независимо от пользователей и ролей Windows.Generic principals represent users and roles that exist independent of Windows users and roles.

  • Участники Windows представляют пользователей Windows и их роли (или их группы Windows).Windows principals represent Windows users and their roles (or their Windows groups). Участник Windows может олицетворять другого пользователя, что означает, что этому участнику разрешен доступ к ресурсу от имени пользователя при предоставлении удостоверения, которое принадлежит этому пользователю.A Windows principal can impersonate another user, which means that the principal can access a resource on a user's behalf while presenting the identity that belongs to that user.

  • Настраиваемые участники могут определяться приложением любым способом, который необходим для данного конкретного приложения.Custom principals can be defined by an application in any way that is needed for that particular application. При этом можно расширять базовое определение удостоверения и ролей участника.They can extend the basic notion of the principal's identity and roles.

Дополнительные сведения см. в разделе Объекты Principal и Identity.For more information, see Principal and Identity Objects.

Проверка подлинностиAuthentication

Проверка подлинности (аутентификация) — это процесс обнаружения и проверки удостоверения участника путем проверки учетных данных пользователя и проверки этих учетных данных в отношении некоторого центра сертификации.Authentication is the process of discovering and verifying the identity of a principal by examining the user's credentials and validating those credentials against some authority. Сведения, полученные во время проверки подлинности, можно напрямую использовать в коде.The information obtained during authentication is directly usable by your code. Для проверки подлинности текущего пользователя и определения, следует ли предоставить этому участнику доступ к коду, можно также использовать безопасность на основе ролей в .NET Framework.You can also use .NET Framework role-based security to authenticate the current user and to determine whether to allow that principal to access your code. Примеры проверки подлинности участника для конкретных ролей см. в описании перегрузок метода WindowsPrincipal.IsInRole.See the overloads of the WindowsPrincipal.IsInRole method for examples of how to authenticate the principal for specific roles. Например, можно использовать перегрузку WindowsPrincipal.IsInRole(String), чтобы определить, является ли текущий пользователь членом группы «Администраторы».For example, you can use the WindowsPrincipal.IsInRole(String) overload to determine if the current user is a member of the Administrators group.

В настоящее время используется ряд механизмов проверки подлинности, многие из которых могут быть использованы вместе с безопасностью на основе ролей в .NET Framework.A variety of authentication mechanisms are used today, many of which can be used with .NET Framework role-based security. Некоторые из наиболее часто используемых механизмов — это обычная проверка подлинности, дайджест-проверка подлинности, проверка подлинности по паспорту, проверка подлинности операционной системы (например, NTLM или Kerberos) или механизмы, определяемые приложением.Some of the most commonly used mechanisms are basic, digest, Passport, operating system (such as NTLM or Kerberos), or application-defined mechanisms.

ПримерExample

Следующий пример требует, чтобы активный участник был администратором.The following example requires that the active principal be an administrator. Параметр name имеет значение null, что позволяет любому пользователю с правами администратора проходить требование.The name parameter is null, which allows any user who is an administrator to pass the demand.

Примечание

В Windows Vista привилегии пользователя определяются контролем учетных записей (UAC).In Windows Vista, User Account Control (UAC) determines the privileges of a user. Члену встроенной группы «Администраторы» присваивается два маркера доступа на время выполнения: маркер доступа обычного пользователя и маркер доступа администратора.If you are a member of the Built-in Administrators group, you are assigned two run-time access tokens: a standard user access token and an administrator access token. По умолчанию назначена роль обычного пользователя.By default, you are in the standard user role. Чтобы выполнить код, требующий прав администратора, необходимо сначала повысить права от прав стандартного пользователя до прав администратора.To execute the code that requires you to be an administrator, you must first elevate your privileges from standard user to administrator. Это можно сделать при запуске приложения, , щелкнув значок приложения правой кнопкой мыши и указав, что приложение должно запускаться от имени администратора.You can do this when you start an application by right-clicking the application icon and indicating that you want to run as an 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

Следующий пример демонстрирует, как определить удостоверение участника и доступные для него роли.The following example demonstrates how to determine the identity of the principal and the roles available to the principal. Приложение в этом примере должно проверять, что текущий пользователь имеет роль, которая позволяет использовать приложение.An application of this example might be to confirm that the current user is in a role you allow for using your application.

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

AuthorizationAuthorization

Авторизация — это процесс определения, разрешено ли участнику выполнять запрошенное действие.Authorization is the process of determining whether a principal is allowed to perform a requested action. Авторизация происходит после проверки подлинности и использует сведения об удостоверении и ролях участника, чтобы определить, к каким ресурсам имеет доступ этот участник.Authorization occurs after authentication and uses information about the principal's identity and roles to determine what resources the principal can access. Для реализации авторизации можно использовать безопасность на основе ролей в .NET Framework.You can use .NET Framework role-based security to implement authorization.