Zabezpieczenia dostępu kodu i ADO.NETCode Access Security and ADO.NET

.NET Framework oferuje zabezpieczenia oparte na rolach, a także zabezpieczenia dostępu kodu (CAS), które są implementowane przy użyciu wspólnej infrastruktury dostarczanej przez środowisko uruchomieniowe języka wspólnego (CLR).The .NET Framework offers role-based security as well as code access security (CAS), both of which are implemented using a common infrastructure supplied by the common language runtime (CLR). W świecie kodu niezarządzanego większość aplikacji jest wykonywanych z uprawnieniami użytkownika lub podmiotu zabezpieczeń.In the world of unmanaged code, most applications execute with the permissions of the user or principal. W związku z tym systemy komputerowe mogą być uszkodzone, a dane prywatne zostały naruszone, gdy złośliwe lub błędne oprogramowanie jest uruchamiane przez użytkownika z podniesionymi uprawnieniami.As a result, computer systems can be damaged and private data compromised when malicious or error-filled software is run by a user with elevated privileges.

Z kolei kod zarządzany wykonywany w .NET Framework obejmuje zabezpieczenia dostępu kodu, który ma zastosowanie tylko do kodu.By contrast, managed code executing in the .NET Framework includes code access security, which applies to code alone. Czy kod może być uruchamiany lub nie zależy od pochodzenia kodu lub innych aspektów tożsamości kodu, nie tylko tożsamości podmiotu zabezpieczeń.Whether the code is allowed to run or not depends on the code's origin or other aspects of the code's identity, not solely the identity of the principal. Zmniejsza to prawdopodobieństwo, że kod zarządzany może być nieużywany.This reduces the likelihood that managed code can be misused.

Uprawnienia dostępu koduCode Access Permissions

Gdy kod jest wykonywany, prezentuje dowód, który jest oceniany przez system zabezpieczeń środowiska CLR.When code is executed, it presents evidence that is evaluated by the CLR security system. Zazwyczaj ten dowód obejmuje pochodzenie kodu, w tym adres URL, witrynę i strefę, oraz podpisy cyfrowe, które zapewniają tożsamość zestawu.Typically, this evidence comprises the origin of the code including URL, site, and zone, and digital signatures that ensure the identity of the assembly.

Środowisko CLR umożliwia kod do wykonywania tylko tych operacji, do których kod ma uprawnienia do wykonania.The CLR allows code to perform only those operations that the code has permission to perform. Kod może zażądać uprawnień i te żądania są honorowane na podstawie zasad zabezpieczeń ustawionych przez administratora.Code can request permissions, and those requests are honored based on the security policy set by an administrator.

Uwaga

Kod wykonywany w środowisku CLR nie może udzielić uprawnień do samego siebie.Code executing in the CLR cannot grant permissions to itself. Na przykład kod może zażądać i uzyskać mniejsze uprawnienia niż zezwala na to zasady zabezpieczeń, ale nigdy nie zostanie przyznane więcej uprawnień.For example, code can request and be granted fewer permissions than a security policy allows, but it will never be granted more permissions. Podczas udzielania uprawnień Zacznij od braku uprawnień, a następnie Dodaj najwęższe uprawnienia dla danego wykonywanego zadania.When granting permissions, start with no permissions at all and then add the narrowest permissions for the particular task being performed. Począwszy od wszystkich uprawnień, a następnie odmowy poszczególnym osobom potencjalną ochronę niezabezpieczonych aplikacji, które mogą zawierać niezamierzone luki w zabezpieczeniach przed przyznaniem im więcej uprawnień niż jest to wymagane.Starting with all permissions and then denying individual ones leads to insecure applications that may contain unintentional security holes from granting more permissions than required. Aby uzyskać więcej informacji, zobacz Konfigurowanie zasad zabezpieczeń i Zarządzanie zasadami zabezpieczeń.For more information, see Configuring Security Policy and Security Policy Management.

Istnieją trzy typy uprawnień dostępu kodu:There are three types of code access permissions:

  • Code access permissions pochodny od CodeAccessPermission klasy.Code access permissions derive from the CodeAccessPermission class. Uprawnienia są wymagane w celu uzyskania dostępu do chronionych zasobów, takich jak pliki i zmienne środowiskowe, oraz do wykonywania operacji chronionych, takich jak uzyskiwanie dostępu do kodu niezarządzanego.Permissions are required in order to access protected resources, such as files and environment variables, and to perform protected operations, such as accessing unmanaged code.

  • Identity permissions reprezentuje charakterystykę identyfikującą zestaw.Identity permissions represent characteristics that identify an assembly. Uprawnienia są przyznawane zestawowi w oparciu o dowód, który może zawierać elementy, takie jak podpis cyfrowy lub kod pochodzący z programu.Permissions are granted to an assembly based on evidence, which can include items such as a digital signature or where the code originated. Uprawnienia tożsamości pochodzą także od CodeAccessPermission klasy bazowej.Identity permissions also derive from the CodeAccessPermission base class.

  • Role-based security permissions są zależne od tego, czy podmiot zabezpieczeń ma określoną tożsamość, czy jest członkiem określonej roli.Role-based security permissions are based on whether a principal has a specified identity or is a member of a specified role. PrincipalPermissionKlasa umożliwia zarówno deklaratywne, jak i bezwzględne sprawdzanie uprawnień względem aktywnego podmiotu zabezpieczeń.The PrincipalPermission class allows both declarative and imperative permission checks against the active principal.

Aby ustalić, czy kod jest autoryzowany do uzyskania dostępu do zasobu lub wykonywania operacji, system zabezpieczeń środowiska uruchomieniowego przechodzi przez stos wywołań, porównując przyznane uprawnienia każdego wywołującego z wymaganym uprawnieniem.To determine whether code is authorized to access a resource or perform an operation, the runtime's security system traverses the call stack, comparing the granted permissions of each caller to the permission being demanded. Jeśli jakikolwiek obiekt wywołujący w stosie wywołań nie ma wymaganego uprawnienia, SecurityException zgłaszany jest wyjątek i dostęp zostaje odrzucony.If any caller in the call stack does not have the demanded permission, a SecurityException is thrown and access is refused.

Żądanie uprawnieńRequesting Permissions

Celem żądania uprawnień jest informowanie środowiska uruchomieniowego o uprawnieniach wymaganych przez aplikację w celu ich uruchomienia i upewnienia się, że otrzymuje tylko uprawnienia, których rzeczywiście potrzebuje.The purpose of requesting permissions is to inform the runtime which permissions your application requires in order to run, and to ensure that it receives only the permissions that it actually needs. Na przykład, jeśli aplikacja wymaga zapisu danych na dysku lokalnym, wymaga FileIOPermission .For example, if your application needs to write data to the local disk, it requires FileIOPermission. Jeśli to uprawnienie nie zostało przyznane, aplikacja zakończy się niepowodzeniem podczas próby zapisu na dysku.If that permission hasn't been granted, the application will fail when it attempts to write to the disk. Jeśli jednak aplikacja FileIOPermission nie udzieliła żądań, a to uprawnienie nie zostało przyznane, aplikacja będzie generować wyjątek na początku i nie będzie ładować.However, if the application requests FileIOPermission and that permission has not been granted, the application will generate the exception at the outset and will not load.

W scenariuszu, w którym aplikacja musi tylko odczytywać dane z dysku, można zażądać, aby nigdy nie mieć uprawnień do zapisu.In a scenario where the application only needs to read data from the disk, you can request that it never be granted any write permissions. W przypadku usterki lub złośliwego ataku kod nie może uszkodzić danych, na których działa.In the event of a bug or a malicious attack, your code cannot damage the data on which it operates. Aby uzyskać więcej informacji, zobacz żądanie uprawnień.For more information, see Requesting Permissions.

Zabezpieczenia oparte na rolach i urzędy certyfikacjiRole-Based Security and CAS

Implementowanie zabezpieczeń opartych na rolach i zabezpieczeń dostępu do kodu (CAS) zwiększa ogólne zabezpieczenia aplikacji.Implementing both role-based security and code-accessed security (CAS) enhances overall security for your application. Zabezpieczenia oparte na rolach mogą opierać się na koncie systemu Windows lub tożsamości niestandardowej, co umożliwia tworzenie informacji o podmiotu zabezpieczeń dostępnym dla bieżącego wątku.Role-based security can be based on a Windows account or a custom identity, making information about the security principal available to the current thread. Ponadto aplikacje są często wymagane w celu zapewnienia dostępu do danych lub zasobów na podstawie poświadczeń dostarczonych przez użytkownika.In addition, applications are often required to provide access to data or resources based on credentials supplied by the user. Zazwyczaj takie aplikacje sprawdzają rolę użytkownika i zapewniają dostęp do zasobów na podstawie tych ról.Typically, such applications check the role of a user and provide access to resources based on those roles.

Zabezpieczenia oparte na rolach umożliwiają składnikowi identyfikację bieżących użytkowników i skojarzonych z nimi ról w czasie wykonywania.Role-based security enables a component to identify current users and their associated roles at run time. Te informacje są następnie mapowane przy użyciu zasad CAS w celu określenia zestawu uprawnień udzielanego w czasie wykonywania.This information is then mapped using a CAS policy to determine the set of permissions granted at run time. Dla określonej domeny aplikacji host może zmienić domyślne zasady zabezpieczeń oparte na rolach i ustawić domyślny podmiot zabezpieczeń, który reprezentuje użytkownika i role skojarzone z tym użytkownikiem.For a specified application domain, the host can change the default role-based security policy and set a default security principal that represents a user and the roles associated with that user.

Środowisko CLR używa uprawnień do zaimplementowania mechanizmu do wymuszania ograniczeń w kodzie zarządzanym.The CLR uses permissions to implement its mechanism for enforcing restrictions on managed code. Uprawnienia zabezpieczeń oparte na rolach zapewniają mechanizm wykrywania, czy użytkownik (lub agent działający w imieniu użytkownika) ma określoną tożsamość lub jest członkiem określonej roli.Role-based security permissions provide a mechanism for discovering whether a user (or the agent acting on the user's behalf) has a particular identity or is a member of a specified role. Aby uzyskać więcej informacji, zobacz uprawnienia zabezpieczeń.For more information, see Security Permissions.

W zależności od typu kompilowanej aplikacji należy również rozważyć zaimplementowanie uprawnień opartych na rolach w bazie danych.Depending on the type of application you are building, you should also consider implementing role-based permissions in the database. Aby uzyskać więcej informacji na temat zabezpieczeń opartych na rolach w SQL Server, zobacz SQL Server Security.For more information on role-based security in SQL Server, see SQL Server Security.

ZestawyAssemblies

Zestawy stanowią podstawową jednostkę wdrożenia, kontrolę wersji, ponowne użycie, zakres aktywacji i uprawnienia zabezpieczeń dla aplikacji .NET Framework.Assemblies form the fundamental unit of deployment, version control, reuse, activation scoping, and security permissions for a .NET Framework application. Zestaw zawiera kolekcję typów i zasobów, które są tworzone w celu współdziałania i tworzą logiczną jednostkę funkcjonalności.An assembly provides a collection of types and resources that are built to work together and form a logical unit of functionality. W środowisku CLR typ nie istnieje poza kontekstem zestawu.To the CLR, a type does not exist outside the context of an assembly. Aby uzyskać więcej informacji na temat tworzenia i wdrażania zestawów, zobacz programowanie z zestawami.For more information on creating and deploying assemblies, see Programming with Assemblies.

Zestawy o silnych nazwachStrong-naming Assemblies

Silna nazwa lub podpis cyfrowy składa się z tożsamości zestawu, która obejmuje jego prostą nazwę tekstu, numer wersji i informacje o kulturze (jeśli zostały podane) oraz klucz publiczny i podpis cyfrowy.A strong name, or digital signature, consists of the assembly's identity, which includes its simple text name, version number, and culture information (if provided), plus a public key and a digital signature. Podpis cyfrowy jest generowany na podstawie pliku zestawu przy użyciu odpowiedniego klucza prywatnego.The digital signature is generated from an assembly file using the corresponding private key. Plik zestawu zawiera manifest zestawu, który zawiera nazwy i skróty wszystkich plików, które tworzą zestaw.The assembly file contains the assembly manifest, which contains the names and hashes of all the files that make up the assembly.

Silne nazewnictwo zestawu daje aplikacji lub składnikowi unikatową tożsamość, która może być używana przez inne oprogramowanie do jawnego odwoływania się do niego.Strong naming an assembly gives an application or component a unique identity that other software can use to refer explicitly to it. Zestawy chroniące silne nazewnictwo przed fałszowaniem przez zestaw, który zawiera kod nieszkodliwy.Strong naming guards assemblies against being spoofed by an assembly that contains hostile code. Silne nazewnictwo zapewnia także spójność wersji między różnymi wersjami składnika.Strong-naming also ensures versioning consistency among different versions of a component. Należy wdrożyć zestawy o silnych nazwach, które zostaną wdrożone w globalnej pamięci podręcznej zestawów (GAC).You must strong name assemblies that will be deployed to the Global Assembly Cache (GAC). Aby uzyskać więcej informacji, zobacz Tworzenie i używanie zestawów o silnej nazwie.For more information, see Creating and Using Strong-Named Assemblies.

Częściowe zaufanie w ADO.NET 2,0Partial Trust in ADO.NET 2.0

W ADO.NET 2,0 Dostawca danych .NET Framework, SQL Server .NET Framework Dostawca danych dla OLE DB, .NET Framework dostawca danych dla ODBC, a .NET Framework dostawca danych dla programu Oracle można teraz uruchamiać w częściowo zaufanych środowiskach.In ADO.NET 2.0, the .NET Framework Data Provider for SQL Server, the .NET Framework Data Provider for OLE DB, the .NET Framework Data Provider for ODBC, and the .NET Framework Data Provider for Oracle can now all run in partially trusted environments. W poprzednich wersjach .NET Framework System.Data.SqlClient były obsługiwane tylko w mniej niż aplikacje w pełni zaufane.In previous releases of the .NET Framework, only System.Data.SqlClient was supported in less than full-trust applications.

Co najmniej częściowo zaufana Aplikacja korzystająca z dostawcy SQL Server musi mieć uprawnienia wykonywania i SqlClientPermission uprawnień.At minimum, a partially trusted application using the SQL Server provider must have execution and SqlClientPermission permissions.

Właściwości atrybutu uprawnienia dla częściowej relacji zaufaniaPermission Attribute Properties for Partial Trust

W przypadku scenariuszy częściowej relacji zaufania można użyć SqlClientPermissionAttribute elementów członkowskich, aby dodatkowo ograniczyć możliwości dostępne dla Dostawca danych .NET Framework SQL Server.For partial trust scenarios, you can use SqlClientPermissionAttribute members to further restrict the capabilities available for the .NET Framework Data Provider for SQL Server.

W poniższej tabeli wymieniono dostępne SqlClientPermissionAttribute właściwości i ich opisy:The following table lists the available SqlClientPermissionAttribute properties and their descriptions:

Właściwość atrybutu uprawnieniaPermission attribute property OpisDescription
Action Pobiera lub ustawia akcję zabezpieczeń.Gets or sets a security action. Dziedziczone z SecurityAttribute .Inherited from SecurityAttribute.
AllowBlankPassword Włącza lub wyłącza użycie pustego hasła w parametrach połączenia.Enables or disables the use of a blank password in a connection string. Prawidłowe wartości to true (aby umożliwić korzystanie z pustych haseł) i false (Aby wyłączyć używanie pustych haseł).Valid values are true (to enable the use of blank passwords) and false (to disable the use of blank passwords). Dziedziczone z DBDataPermissionAttribute .Inherited from DBDataPermissionAttribute.
ConnectionString Identyfikuje dozwolone parametry połączenia.Identifies a permitted connection string. Można zidentyfikować wiele parametrów połączenia.Multiple connection strings can be identified. Uwaga: W parametrach połączenia nie należy umieszczać identyfikatora użytkownika ani hasła.Note: Do not include a user ID or password in your connection string. W tej wersji nie można zmienić ograniczeń parametrów połączenia za pomocą narzędzia konfiguracji .NET Framework.In this release, you cannot change connection string restrictions using the .NET Framework Configuration Tool.

Dziedziczone z DBDataPermissionAttribute .Inherited from DBDataPermissionAttribute.
KeyRestrictions Określa parametry parametrów połączenia, które są dozwolone lub niedozwolone.Identifies connection string parameters that are allowed or disallowed. Parametry parametrów połączenia są identyfikowane w formularzu <parameter name>= .Connection string parameters are identified in the form <parameter name>=. Można określić wiele parametrów, rozdzielając je przy użyciu średnika (;).Multiple parameters can be specified, delimited using a semicolon (;). Uwaga: Jeśli nie określisz KeyRestrictions , ale ustawisz KeyRestrictionBehavior Właściwość na AllowOnly lub PreventUsage , nie są dozwolone dodatkowe parametry parametrów połączenia.Note: If you do not specify KeyRestrictions, but you set KeyRestrictionBehavior property to AllowOnly or PreventUsage, no additional connection string parameters are allowed. Dziedziczone z DBDataPermissionAttribute .Inherited from DBDataPermissionAttribute.
KeyRestrictionBehavior Identyfikuje parametry parametrów połączenia jako jedyne dozwolone dodatkowe parametry ( AllowOnly ) lub identyfikuje dodatkowe parametry, które nie są dozwolone ( PreventUsage ).Identifies the connection string parameters as the only additional parameters allowed (AllowOnly), or identifies the additional parameters that are not allowed (PreventUsage). Wartość domyślna to AllowOnly.AllowOnly is the default. Dziedziczone z DBDataPermissionAttribute .Inherited from DBDataPermissionAttribute.
TypeID Pobiera unikatowy identyfikator dla tego atrybutu, gdy jest zaimplementowany w klasie pochodnej.Gets a unique identifier for this attribute when implemented in a derived class. Dziedziczone z Attribute .Inherited from Attribute.
Unrestricted Wskazuje, czy nieograniczone uprawnienia do zasobu są zadeklarowane.Indicates whether unrestricted permission to the resource is declared. Dziedziczone z SecurityAttribute .Inherited from SecurityAttribute.

Składnia ConnectionStringConnectionString Syntax

Poniższy przykład pokazuje, jak używać connectionStrings elementu pliku konfiguracji, aby zezwalać na użycie tylko określonych parametrów połączenia.The following example demonstrates how to use the connectionStrings element of a configuration file to allow only a specific connection string to be used. Zobacz parametry połączeń , aby uzyskać więcej informacji na temat przechowywania i pobierania parametrów połączenia z plików konfiguracji.See Connection Strings for more information on storing and retrieving connection strings from configuration files.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;" />  
</connectionStrings>  

Składnia ograniczeń dlaKeyRestrictions Syntax

Poniższy przykład włącza te same parametry połączenia, umożliwia korzystanie z Encrypt Packet Size opcji i parametrów połączenia, ale ogranicza użycie innych opcji parametrów połączenia.The following example enables the same connection string, enables the use of the Encrypt and Packet Size connection string options, but restricts the use of any other connection string options.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;"  
    KeyRestrictions="Encrypt=;Packet Size=;"  
    KeyRestrictionBehavior="AllowOnly" />  
</connectionStrings>  

KeyRestrictionBehavior z składnią PreventUsageKeyRestrictionBehavior with PreventUsage Syntax

W poniższym przykładzie są włączane te same parametry połączenia i można je wszystkie inne parametrów połączenia z wyjątkiem dla User Id Password i Persist Security Info .The following example enables the same connection string and allows all other connection parameters except for User Id, Password and Persist Security Info.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;"  
    KeyRestrictions="User Id=;Password=;Persist Security Info=;"  
    KeyRestrictionBehavior="PreventUsage" />  
</connectionStrings>  

KeyRestrictionBehavior z składnią AllowOnlyKeyRestrictionBehavior with AllowOnly Syntax

Poniższy przykład włącza dwa parametry połączenia, które zawierają również Initial Catalog Connection Timeout Parametry,, Encrypt i Packet Size .The following example enables two connection strings that also contain Initial Catalog, Connection Timeout, Encrypt, and Packet Size parameters. Wszystkie inne parametry parametrów połączenia są ograniczone.All other connection string parameters are restricted.

<connectionStrings>  
  <add name="DatabaseConnection"
    connectionString="Data Source=(local);Initial
    Catalog=Northwind;Integrated Security=true;"  
    KeyRestrictions="Initial Catalog;Connection Timeout=;  
       Encrypt=;Packet Size=;"
    KeyRestrictionBehavior="AllowOnly" />  
  
  <add name="DatabaseConnection2"
    connectionString="Data Source=SqlServer2;Initial
    Catalog=Northwind2;Integrated Security=true;"  
    KeyRestrictions="Initial Catalog;Connection Timeout=;  
       Encrypt=;Packet Size=;"
    KeyRestrictionBehavior="AllowOnly" />  
</connectionStrings>  

Włączanie częściowej relacji zaufania z niestandardowym zestawem uprawnieńEnabling Partial Trust with a Custom Permission Set

Aby umożliwić korzystanie z System.Data.SqlClient uprawnień dla określonej strefy, administrator systemu musi utworzyć niestandardowy zestaw uprawnień i ustawić go jako uprawnienie ustawione dla określonej strefy.To enable the use of System.Data.SqlClient permissions for a particular zone, a system administrator must create a custom permission set and set it as the permission set for a particular zone. Domyślne zestawy uprawnień, takie jak LocalIntranet , nie mogą być modyfikowane.Default permission sets, such as LocalIntranet, cannot be modified. Na przykład aby uwzględnić System.Data.SqlClient uprawnienia dla kodu, który ma Zone LocalIntranet , administrator systemu może skopiować zestaw uprawnień dla LocalIntranet , zmienić nazwę na "CustomLocalIntranet", dodać System.Data.SqlClient uprawnienia, zaimportować zestaw uprawnień CustomLocalIntranet przy użyciu Caspol.exe (Narzędzie zasad zabezpieczeń dostępu kodu)i ustawić zestaw uprawnień LocalIntranet_Zone na CustomLocalIntranet.For example, to include System.Data.SqlClient permissions for code that has a Zone of LocalIntranet, a system administrator could copy the permission set for LocalIntranet, rename it to "CustomLocalIntranet", add the System.Data.SqlClient permissions, import the CustomLocalIntranet permission set using the Caspol.exe (Code Access Security Policy Tool), and set the permission set of LocalIntranet_Zone to CustomLocalIntranet.

Przykładowy zestaw uprawnieńSample Permission Set

Poniżej znajduje się przykładowy zestaw uprawnień dla Dostawca danych .NET Framework w przypadku SQL Server w częściowo zaufanym scenariuszu.The following is a sample permission set for the .NET Framework Data Provider for SQL Server in a partially trusted scenario. Aby uzyskać informacje na temat tworzenia niestandardowych zestawów uprawnień, zobacz konfigurowanie zestawów uprawnień przy użyciu Caspol.exe.For information on creating custom permission sets, see Configuring Permission Sets Using Caspol.exe.

<PermissionSet class="System.Security.NamedPermissionSet"  
  version="1"  
  Name="CustomLocalIntranet"  
  Description="Custom permission set given to applications on  
    the local intranet">  
  
<IPermission class="System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  
version="1"  
AllowBlankPassword="False">  
<add ConnectionString="Data Source=(local);Integrated Security=true;"  
 KeyRestrictions="Initial Catalog=;Connection Timeout=;  
   Encrypt=;Packet Size=;"
 KeyRestrictionBehavior="AllowOnly" />  
 </IPermission>  
</PermissionSet>  

Weryfikowanie dostępu kodu ADO.NET przy użyciu uprawnień zabezpieczeńVerifying ADO.NET Code Access Using Security Permissions

W przypadku scenariuszy częściowej relacji zaufania można wymagać uprawnień urzędów certyfikacji dla określonych metod w kodzie, określając a SqlClientPermissionAttribute .For partial-trust scenarios, you can require CAS privileges for particular methods in your code by specifying a SqlClientPermissionAttribute. Jeśli to uprawnienie nie jest dozwolone przez zasady zabezpieczeń z ograniczeniami, przed uruchomieniem kodu zostanie zgłoszony wyjątek.If that privilege is not allowed by the restricted security policy in effect, an exception is thrown before your code is run. Aby uzyskać więcej informacji na temat zasad zabezpieczeń, Zobacz najlepsze rozwiązania dotyczące zarządzania zasadami zabezpieczeń i zasad zabezpieczeń.For more information on security policy, see Security Policy Management and Security Policy Best Practices.

PrzykładExample

Poniższy przykład ilustruje sposób pisania kodu, który wymaga określonych parametrów połączenia.The following example demonstrates how to write code that requires a particular connection string. Symuluje odrzucanie nieograniczonych uprawnień do System.Data.SqlClient , które mogą zostać wdrożone przez administratora systemu przy użyciu zasad CAS w świecie rzeczywistym.It simulates denying unrestricted permissions to System.Data.SqlClient, which a system administrator would implement using a CAS policy in the real world.

Ważne

Podczas projektowania uprawnień urzędów certyfikacji dla ADO.NET, prawidłowym wzorcem jest rozpoczęcie od najbardziej restrykcyjnego przypadku (bez uprawnień w ogóle), a następnie dodanie określonych uprawnień, które są wymagane dla konkretnego zadania, które kod musi wykonać.When designing CAS permissions for ADO.NET, the correct pattern is to start with the most restrictive case (no permissions at all) and then add the specific permissions that are needed for the particular task that the code needs to perform. Wzorzec odwrotny, zaczynający się od wszystkich uprawnień, a następnie odmawiający określonego uprawnienia, nie jest zabezpieczony, ponieważ istnieje wiele sposobów wyrażania tych samych parametrów połączenia.The opposite pattern, starting with all permissions and then denying a specific permission, is not secure because there are many ways of expressing the same connection string. Jeśli na przykład zaczniesz korzystać z wszystkich uprawnień, a następnie spróbujesz odrzucić użycie parametrów połączenia "serwer = someserver", ciąg "Server = someserver. webcompany. com" nadal będzie dozwolony.For example, if you start with all permissions and then attempt to deny the use of the connection string "server=someserver", the string "server=someserver.mycompany.com" would still be allowed. Zawsze, gdy w ogóle nie przyznano żadnych uprawnień, zmniejszasz prawdopodobieństwo wystąpienia w zestawie uprawnień.By always starting by granting no permissions at all, you reduce the chances that there are holes in the permission set.

Poniższy kod demonstruje, jak SqlClient program wykonuje żądanie zabezpieczeń, które zgłasza, SecurityException czy nie są odpowiednie uprawnienia do urzędów certyfikacji.The following code demonstrates how SqlClient performs the security demand, which throws a SecurityException if the appropriate CAS permissions are not in place. SecurityExceptionDane wyjściowe są wyświetlane w oknie konsoli.The SecurityException output is displayed in the console window.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Security;
using System.Security.Permissions;

namespace PartialTrustTopic {
   public class PartialTrustHelper : MarshalByRefObject {
      public void TestConnectionOpen(string connectionString) {
         // Try to open a connection.
         using (SqlConnection connection = new SqlConnection(connectionString)) {
            connection.Open();
         }
      }
   }

   class Program {
      static void Main(string[] args) {
         TestCAS("Data Source=(local);Integrated Security=true", "Data Source=(local);Integrated Security=true;Initial Catalog=Test");
      }

      static void TestCAS(string connectString1, string connectString2) {
         // Create permission set for sandbox AppDomain.
         // This example only allows execution.
         PermissionSet permissions = new PermissionSet(PermissionState.None);
         permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

         // Create sandbox AppDomain with permission set that only allows execution,
         // and has no SqlClientPermissions.
         AppDomainSetup appDomainSetup = new AppDomainSetup();
         appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
         AppDomain firstDomain = AppDomain.CreateDomain("NoSqlPermissions", null, appDomainSetup, permissions);

         // Create helper object in sandbox AppDomain so that code can be executed in that AppDomain.
         Type helperType = typeof(PartialTrustHelper);
         PartialTrustHelper firstHelper = (PartialTrustHelper)firstDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName);

         try {
            // Attempt to open a connection in the sandbox AppDomain.
            // This is expected to fail.
            firstHelper.TestConnectionOpen(connectString1);
            Console.WriteLine("Connection opened, unexpected.");
         }
         catch (System.Security.SecurityException ex) {
            Console.WriteLine("Failed, as expected: {0}",
                ex.FirstPermissionThatFailed);

            // Uncomment the following line to see Exception details.
            // Console.WriteLine("BaseException: " + ex.GetBaseException());
         }

         // Add permission for a specific connection string.
         SqlClientPermission sqlPermission = new SqlClientPermission(PermissionState.None);
         sqlPermission.Add(connectString1, "", KeyRestrictionBehavior.AllowOnly);

         permissions.AddPermission(sqlPermission);

         AppDomain secondDomain = AppDomain.CreateDomain("OneSqlPermission", null, appDomainSetup, permissions);
         PartialTrustHelper secondHelper = (PartialTrustHelper)secondDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName);

         // Try connection open again, it should succeed now.
         try {
            secondHelper.TestConnectionOpen(connectString1);
            Console.WriteLine("Connection opened, as expected.");
         }
         catch (System.Security.SecurityException ex) {
            Console.WriteLine("Unexpected failure: {0}", ex.Message);
         }

         // Try a different connection string. This should fail.
         try {
            secondHelper.TestConnectionOpen(connectString2);
            Console.WriteLine("Connection opened, unexpected.");
         }
         catch (System.Security.SecurityException ex) {
            Console.WriteLine("Failed, as expected: {0}", ex.Message);
         }
      }
   }
}
Imports System.Data
Imports System.Data.SqlClient
Imports System.Security
Imports System.Security.Permissions

Namespace PartialTrustTopic
    Public Class PartialTrustHelper
        Inherits MarshalByRefObject
        Public Sub TestConnectionOpen(ByVal connectionString As String)
            ' Try to open a connection.
            Using connection As New SqlConnection(connectionString)
                connection.Open()
            End Using
        End Sub
    End Class

    Class Program
        Public Shared Sub Main(ByVal args As String())
            TestCAS("Data Source=(local);Integrated Security=true", "Data Source=(local);Integrated Security=true;Initial Catalog=Test")
        End Sub

        Public Shared Sub TestCAS(ByVal connectString1 As String, ByVal connectString2 As String)
            ' Create permission set for sandbox AppDomain.
            ' This example only allows execution.
            Dim permissions As New PermissionSet(PermissionState.None)
            permissions.AddPermission(New SecurityPermission(SecurityPermissionFlag.Execution))

            ' Create sandbox AppDomain with permission set that only allows execution,
            ' and has no SqlClientPermissions.
            Dim appDomainSetup As New AppDomainSetup()
            appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
            Dim firstDomain As AppDomain = AppDomain.CreateDomain("NoSqlPermissions", Nothing, appDomainSetup, permissions)

            ' Create helper object in sandbox AppDomain so that code can be executed in that AppDomain.
            Dim helperType As Type = GetType(PartialTrustHelper)
            Dim firstHelper As PartialTrustHelper = DirectCast(firstDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName), PartialTrustHelper)

            Try
                ' Attempt to open a connection in the sandbox AppDomain.
                ' This is expected to fail.
                firstHelper.TestConnectionOpen(connectString1)
                Console.WriteLine("Connection opened, unexpected.")
            Catch ex As System.Security.SecurityException

                ' Uncomment the following line to see Exception details.
                ' Console.WriteLine("BaseException: " + ex.GetBaseException());
                Console.WriteLine("Failed, as expected: {0}", ex.FirstPermissionThatFailed)
            End Try

            ' Add permission for a specific connection string.
            Dim sqlPermission As New SqlClientPermission(PermissionState.None)
            sqlPermission.Add(connectString1, "", KeyRestrictionBehavior.AllowOnly)

            permissions.AddPermission(sqlPermission)

            Dim secondDomain As AppDomain = AppDomain.CreateDomain("OneSqlPermission", Nothing, appDomainSetup, permissions)
            Dim secondHelper As PartialTrustHelper = DirectCast(secondDomain.CreateInstanceAndUnwrap(helperType.Assembly.FullName, helperType.FullName), PartialTrustHelper)

            ' Try connection open again, it should succeed now.
            Try
                secondHelper.TestConnectionOpen(connectString1)
                Console.WriteLine("Connection opened, as expected.")
            Catch ex As System.Security.SecurityException
                Console.WriteLine("Unexpected failure: {0}", ex.Message)
            End Try

            ' Try a different connection string. This should fail.
            Try
                secondHelper.TestConnectionOpen(connectString2)
                Console.WriteLine("Connection opened, unexpected.")
            Catch ex As System.Security.SecurityException
                Console.WriteLine("Failed, as expected: {0}", ex.Message)
            End Try
        End Sub
    End Class
End Namespace

Dane wyjściowe powinny być widoczne w oknie konsoli:You should see this output in the Console window:

Failed, as expected: <IPermission class="System.Data.SqlClient.  
SqlClientPermission, System.Data, Version=2.0.0.0,
  Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1"  
  AllowBlankPassword="False">  
<add ConnectionString="Data Source=(local);Initial Catalog=  
  Northwind;Integrated Security=SSPI" KeyRestrictions=""  
KeyRestrictionBehavior="AllowOnly"/>  
</IPermission>  
  
Connection opened, as expected.  
Failed, as expected: Request failed.  

Współdziałanie z kodem niezarządzanymInteroperability with Unmanaged Code

Kod, który jest uruchamiany poza środowiskiem CLR, jest nazywany kodem niezarządzanym.Code that runs outside the CLR is called unmanaged code. Z tego względu mechanizmy zabezpieczeń, takie jak urzędy certyfikacji, nie mogą być stosowane do kodu niezarządzanego.Therefore, security mechanisms such as CAS cannot be applied to unmanaged code. Składniki COM, interfejsy ActiveX i funkcje interfejsu API systemu Windows to przykłady kodu niezarządzanego.COM components, ActiveX interfaces, and Windows API functions are examples of unmanaged code. Specjalne kwestie dotyczące zabezpieczeń są stosowane podczas wykonywania kodu niezarządzanego, aby nie zagrażać ogólnym zabezpieczeniom aplikacji.Special security considerations apply when executing unmanaged code so that you do not jeopardize overall application security. Aby uzyskać więcej informacji, zobacz współdziałanie z kodem niezarządzanym.For more information, see Interoperating with Unmanaged Code.

.NET Framework obsługuje również zgodność z poprzednimi wersjami z istniejącymi składnikami COM przez zapewnienie dostępu za pomocą międzyoperacyjności modelu COM.The .NET Framework also supports backward compatibility to existing COM components by providing access through COM interop. Składniki COM można dołączać do aplikacji .NET Framework przy użyciu narzędzi międzyoperacyjnych modelu COM do importowania odpowiednich typów COM.You can incorporate COM components into a .NET Framework application by using COM interop tools to import the relevant COM types. Po zaimportowaniu typy COM są gotowe do użycia.Once imported, the COM types are ready to use. Współdziałanie modelu COM umożliwia również klientom COM dostęp do kodu zarządzanego przez wyeksportowanie metadanych zestawu do biblioteki typów i zarejestrowanie składnika zarządzanego jako składnika modelu COM.COM interop also enables COM clients to access managed code by exporting assembly metadata to a type library and registering the managed component as a COM component. Aby uzyskać więcej informacji, zobacz Zaawansowane współdziałanie com.For more information, see Advanced COM Interoperability.

Zobacz teżSee also