Codezugriffssicherheit und ADO.NETCode Access Security and ADO.NET

.NET Framework bietet sowohl rollenbasierte Sicherheit als auch Codezugriffssicherheit (Code Access Security, CAS). Beide werden mit einer von der CLR (Common Language Runtime) bereitgestellten gemeinsamen Infrastruktur implementiert.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). In der Welt des nicht verwalteten Codes werden die meisten Anwendungen mit den Berechtigungen des Benutzers oder Prinzipals ausgeführt.In the world of unmanaged code, most applications execute with the permissions of the user or principal. Daher können Computersysteme beschädigt werden und vertrauliche Daten in die falschen Hände gelangen, wenn ein Benutzer mit erweiterten Rechten schädliche oder fehlerhafte Software ausführt.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.

Im Unterschied dazu ist verwalteter Code, der in .NET Framework ausgeführt wird, durch die Codezugriffssicherheit geschützt.By contrast, managed code executing in the .NET Framework includes code access security, which applies to code alone. Ob der Code ausgeführt werden darf, hängt vom Ursprung des Codes oder von anderen Aspekten der Identität des Codes und nicht allein von der Identität des Prinzipals ab.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. Dies verringert die Wahrscheinlichkeit des Missbrauchs von verwaltetem Code.This reduces the likelihood that managed code can be misused.

CodezugriffsberechtigungenCode Access Permissions

Beim Ausführen von Code wird ein Beweis bereitgestellt, der vom CLR-Sicherheitssystem ausgewertet wird.When code is executed, it presents evidence that is evaluated by the CLR security system. Dieser Beweis umfasst i. d. R. die Herkunft des Codes, wozu URL, Site, Zone und digitale Signaturen gehören, die die Identität der Assembly gewährleisten.Typically, this evidence comprises the origin of the code including URL, site, and zone, and digital signatures that ensure the identity of the assembly.

Die CLR ermöglicht es Code, nur die Vorgänge auszuführen, zu denen er berechtigt ist.The CLR allows code to perform only those operations that the code has permission to perform. Code kann Berechtigungen anfordern, und diese Berechtigungen werden entsprechend der von einem Administrator festgelegten Sicherheitsrichtlinie gewährt.Code can request permissions, and those requests are honored based on the security policy set by an administrator.

Hinweis

Code, der in der CLR ausgeführt wird, kann sich nicht selbst Berechtigungen erteilen.Code executing in the CLR cannot grant permissions to itself. So kann Code z. B. weniger Berechtigungen anfordern und gewährt bekommen, als in einer Sicherheitsrichtlinie festgelegt sind, mehr als die darin festgelegten Berechtigungen werden aber auf keinen Fall gewährt.For example, code can request and be granted fewer permissions than a security policy allows, but it will never be granted more permissions. Beim Gewähren von Berechtigungen hat es sich bewährt, zunächst ganz ohne Berechtigungen zu beginnen und immer nur die geringstmöglichen Berechtigungen für die konkrete auszuführende Aufgabe hinzuzufügen.When granting permissions, start with no permissions at all and then add the narrowest permissions for the particular task being performed. Wenn man stattdessen zu Beginn alle Berechtigungen gewährt und dann nur einzelne Berechtigungen wieder entzieht, entstehen unsichere Anwendungen, die unbeabsichtigte Sicherheitslücken enthalten können, weil mehr Berechtigungen als notwendig gewährt wurden.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. Weitere Informationen finden Sie unter Konfigurieren der Sicherheitsrichtlinien und Serversicherheits-richtlinienverwaltung.For more information, see Configuring Security Policy and Security Policy Management.

Es gibt die folgenden drei Arten von Codezugriffsberechtigungen:There are three types of code access permissions:

  • Code access permissions leiten sich aus der CodeAccessPermission-Klasse her.Code access permissions derive from the CodeAccessPermission class. Die Berechtigungen werden benötigt, um auf geschützte Ressourcen, z. B. Dateien und Umgebungsvariablen, zugreifen und geschützte Vorgänge, z. B. das Zugreifen auf nicht verwalteten Code, ausführen zu können.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 stehen für Eigenschaften, die eine Assembly identifizieren.Identity permissions represent characteristics that identify an assembly. Die Berechtigungen werden einer Assembly nach Vorlage eines Beweises gewährt. Als Beweise gelten z. B. digitale Signaturen oder der Ursprung des Codes.Permissions are granted to an assembly based on evidence, which can include items such as a digital signature or where the code originated. Identitätsberechtigungen leiten sich auch von der CodeAccessPermission-Basisklasse her.Identity permissions also derive from the CodeAccessPermission base class.

  • Role-based security permissions basieren darauf, ob ein Prinzipal eine bestimmte Identität besitzt oder Member einer bestimmten Rolle ist.Role-based security permissions are based on whether a principal has a specified identity or is a member of a specified role. Die Klasse PrincipalPermission ermöglicht sowohl deklarative als auch imperative Berechtigungsprüfungen des aktiven Prinzipals.The PrincipalPermission class allows both declarative and imperative permission checks against the active principal.

Zur Bestimmung, ob Code auf eine Ressource zugreifen oder einen Vorgang ausführen darf, durchläuft das Laufzeit-Sicherheitssystem die Aufrufliste und vergleicht dabei die gewährten Berechtigungen der einzelnen Aufrufer mit den angeforderten Berechtigungen.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. Wenn einer der Aufrufer in der Aufrufliste die angeforderte Berechtigung nicht besitzt, wird eine SecurityException ausgelöst, und der Zugriff wird verweigert.If any caller in the call stack does not have the demanded permission, a SecurityException is thrown and access is refused.

Anfordern von BerechtigungenRequesting Permissions

Zweck der Anforderung von Berechtigungen ist es, die Laufzeit darüber zu informieren, welche Berechtigungen Ihre Anwendung zum Ausführen benötigt, und sicherzustellen, dass die Anwendung nur die Berechtigungen erhält, die sie tatsächlich benötigt.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. Wenn die Anwendung z. B. Daten auf die lokale Festplatte schreiben muss, benötigt sie die FileIOPermission.For example, if your application needs to write data to the local disk, it requires FileIOPermission. Wenn diese Berechtigung nicht gewährt wurde, schlagen alle Versuche, auf die Festplatte zu schreiben, fehl.If that permission hasn't been granted, the application will fail when it attempts to write to the disk. Wenn die Anwendung die FileIOPermission anfordert und die Berechtigung nicht gewährt wurde, generiert die Anwendung aber von vornherein die Ausnahme und wird nicht geladen.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.

In einem Szenario, in dem die Anwendung nur Daten vom Datenträger lesen muss, können Sie festlegen, dass der Anwendung niemals Schreibberechtigungen gewährt werden.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. Auf diese Weise kann Ihr Code im Falle eines Fehlers im Programm oder eines bösartigen Angriffs die Daten, mit denen er arbeitet, nicht beschädigen.In the event of a bug or a malicious attack, your code cannot damage the data on which it operates. Weitere Informationen finden Sie unter Anfordern von Berechtigungen.For more information, see Requesting Permissions.

Rollenbasierte Sicherheit und CASRole-Based Security and CAS

Durch Implementieren der rollenbasierten Sicherheit und der Codezugriffssicherheit (CAS) lässt sich die Gesamtsicherheit Ihrer Anwendung verbessern.Implementing both role-based security and code-accessed security (CAS) enhances overall security for your application. Als Grundlage für die rollenbasierte Sicherheit kann ein Windows-Konto oder eine benutzerdefinierte Identität verwendet werden, wodurch die Informationen zum Sicherheitsprinzipal für den aktuellen Thread verfügbar werden.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. Anwendungen müssen darüber hinaus oft anhand der vom Benutzer bereitgestellten Anmeldeinformationen Daten- oder Ressourcenzugriff gewähren.In addition, applications are often required to provide access to data or resources based on credentials supplied by the user. In der Regel überprüfen diese Anwendungen zunächst die Rolle des Benutzers und stellen dann auf Grundlage dieser Rolle den Zugriff auf Ressourcen bereit.Typically, such applications check the role of a user and provide access to resources based on those roles.

Die rollenbasierte Sicherheit ermöglicht es einer Komponente, zur Laufzeit aktuelle Benutzer und die ihnen zugeordneten Rollen zu identifizieren.Role-based security enables a component to identify current users and their associated roles at run time. Diese Informationen werden dann mithilfe einer CAS-Richtlinie zugeordnet, um die zur Laufzeit gewährten Berechtigungen zu bestimmen.This information is then mapped using a CAS policy to determine the set of permissions granted at run time. Für eine bestimmte Anwendungsdomäne kann der Host die Standardrichtlinie der rollenbasierten Sicherheit ändern und einen Standardsicherheitsprinzipal festlegen, der für einen Benutzer und die mit diesem Benutzer verknüpften Rollen steht.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.

Die CLR verwendet Berechtigungen zum Implementieren ihres Mechanismus zur Durchsetzung von Beschränkungen für verwalteten Code.The CLR uses permissions to implement its mechanism for enforcing restrictions on managed code. Rollenbasierte Sicherheitsberechtigungen bieten die Möglichkeit aufzudecken, ob ein Benutzer (oder der Agent, der im Auftrag des Benutzers agiert) eine bestimmte Identität besitzt oder Member einer bestimmten Rolle ist.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. Weitere Informationen finden Sie unter Sicherheitsberechtigungen.For more information, see Security Permissions.

Je nach Art der Anwendung, die Sie erstellen, sollten Sie in Erwägung ziehen, rollenbasierte Berechtigungen in der Datenbank zu implementieren.Depending on the type of application you are building, you should also consider implementing role-based permissions in the database. Weitere Informationen zu rollenbasierte Sicherheit in SQL Server, finden Sie unter SQL Server-Sicherheit.For more information on role-based security in SQL Server, see SQL Server Security.

AssemblysAssemblies

Assemblys bilden die Grundlage für die Bereitstellung, die Versionskontrolle, die Wiederverwendung, die Festlegung des Aktivierungsumfangs und die Sicherheitsberechtigungen für eine .NET Framework-Anwendung.Assemblies form the fundamental unit of deployment, version control, reuse, activation scoping, and security permissions for a .NET Framework application. Eine Assembly stellt eine Sammlung von Typen und Ressourcen bereit, die zusammenarbeiten und eine logische Funktionalitätseinheit bilden.An assembly provides a collection of types and resources that are built to work together and form a logical unit of functionality. Für die CLR existiert ein Typ niemals außerhalb des Kontexts einer Assembly.To the CLR, a type does not exist outside the context of an assembly. Weitere Informationen zum Erstellen und Bereitstellen von Assemblys finden Sie unter Programmieren mit Assemblys.For more information on creating and deploying assemblies, see Programming with Assemblies.

Assemblys mit starkem NamenStrong-naming Assemblies

Ein starker Name (oder eine digitale Signatur) setzt sich aus der Identität der Assembly mit einfachem Textnamen, Versionsnummer und (sofern vorhanden) Kulturinformationen sowie einem öffentlichen Schlüssel und einer digitalen Signatur zusammen.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. Die digitale Signatur wird mit dem entsprechenden privaten Schlüssel aus einer Assemblydatei generiert.The digital signature is generated from an assembly file using the corresponding private key. Die Assemblydatei enthält das Assemblymanifest, das wiederum die Namen und Hashes aller Dateien enthält, die die Assembly bilden.The assembly file contains the assembly manifest, which contains the names and hashes of all the files that make up the assembly.

Wenn eine Assembly mit einem starken Namen versehen wird, erhalten Anwendungen oder Komponenten eine eindeutige Identität, über die andere Software explizit auf die Assembly verweisen können.Strong naming an assembly gives an application or component a unique identity that other software can use to refer explicitly to it. Ein starker Name schützt Assemblys vor Angriffen durch andere Assemblys, die bösartigen Code enthalten.Strong naming guards assemblies against being spoofed by an assembly that contains hostile code. Außerdem wird durch starke Namen die Versionskonsistenz zwischen verschiedenen Versionen einer Komponente gewährleistet.Strong-naming also ensures versioning consistency among different versions of a component. Assemblys, die im globalen Assemblycache (GAC) bereitgestellt werden sollen, müssen einen starken Namen erhalten.You must strong name assemblies that will be deployed to the Global Assembly Cache (GAC). Weitere Informationen finden Sie unter Erstellen und Verwenden von Assemblys mit starkem Namen.For more information, see Creating and Using Strong-Named Assemblies.

Teilweise Vertrauenswürdigkeit in ADO.NET 2.0Partial Trust in ADO.NET 2.0

In ADO.NET 2.0 können der .NET Framework-Datenanbieter für SQL Server, der .NET Framework-Datenanbieter für OLE DB, der .NET Framework-Datenanbieter für ODBC und der .NET Framework-Datenanbieter für Oracle jetzt alle in teilweise vertrauenswürdigen Umgebungen ausgeführt werden.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. In früheren Releases von .NET Framework wurde nur System.Data.SqlClient in nicht vollständig vertrauenswürdigen Umgebungen unterstützt.In previous releases of the .NET Framework, only System.Data.SqlClient was supported in less than full-trust applications.

Eine teilweise vertrauenswürdige Anwendung, die den Datenanbieter für SQL Server verwendet, muss mindestens die Berechtigung zum Ausführen und die SqlClientPermission-Berechtigung besitzen.At minimum, a partially trusted application using the SQL Server provider must have execution and SqlClientPermission permissions.

Eigenschaften von Berechtigungsattributen für teilweise VertrauenswürdigkeitPermission Attribute Properties for Partial Trust

In Szenarien für teilweise Vertrauenswürdigkeit können Sie SqlClientPermissionAttribute-Member zur weiteren Einschränkung der verfügbaren Funktionen des .NET Framework-Datenanbieters für SQL Server verwenden.For partial trust scenarios, you can use SqlClientPermissionAttribute members to further restrict the capabilities available for the .NET Framework Data Provider for SQL Server.

In der folgenden Tabelle werden die verfügbaren SqlClientPermissionAttribute-Eigenschaften mit ihren Beschreibungen aufgeführt:The following table lists the available SqlClientPermissionAttribute properties and their descriptions:

BerechtigungsattributeigenschaftPermission attribute property BeschreibungDescription
Action Ruft eine Sicherheitsaktion ab oder legt diese fest.Gets or sets a security action. Wird von SecurityAttribute geerbt.Inherited from SecurityAttribute.
AllowBlankPassword Aktiviert oder deaktiviert die Verwendung von leeren Kennwörtern in einer Verbindungszeichenfolge.Enables or disables the use of a blank password in a connection string. Gültige Werte sind true (zum Aktivieren der Verwendung von leeren Kennwörtern) und false (zum Deaktivieren der Verwendung von leeren Kennwörtern).Valid values are true (to enable the use of blank passwords) and false (to disable the use of blank passwords). Wird von DBDataPermissionAttribute geerbt.Inherited from DBDataPermissionAttribute.
ConnectionString Gibt eine zulässige Verbindungszeichenfolge an.Identifies a permitted connection string. Es können mehrere Verbindungszeichenfolgen angegeben werden.Multiple connection strings can be identified. Hinweis: Die Verbindungszeichenfolge darf keine Benutzer-ID und kein Kennwort enthalten.Note: Do not include a user ID or password in your connection string. In diesem Release können Einschränken von Verbindungszeichenfolgen nicht mit dem .NET Framework-Konfigurationstool geändert werden.In this release, you cannot change connection string restrictions using the .NET Framework Configuration Tool.

Wird von DBDataPermissionAttribute geerbt.Inherited from DBDataPermissionAttribute.
KeyRestrictions Gibt zulässige oder unzulässige Parameter für Verbindungszeichenfolgen an.Identifies connection string parameters that are allowed or disallowed. Parameter für Verbindungszeichenfolgen werden in der Form identifiziert <Parametername > =.Connection string parameters are identified in the form <parameter name>=. Es können mehrere durch Semikolon (;) getrennte Parameter angegeben werden.Multiple parameters can be specified, delimited using a semicolon (;). Hinweis: Wenn Sie keine KeyRestrictions angeben, die KeyRestrictionBehavior-Eigenschaft aber auf AllowOnly oder PreventUsage festlegen, sind keine zusätzlichen Verbindungszeichenfolgenparameter zulässig.Note: If you do not specify KeyRestrictions, but you set KeyRestrictionBehavior property to AllowOnly or PreventUsage, no additional connection string parameters are allowed. Wird von DBDataPermissionAttribute geerbt.Inherited from DBDataPermissionAttribute.
KeyRestrictionBehavior Legt die Verbindungszeichenfolgenparameter als die einzigen zulässigen zusätzlichen Parameter fest (AllowOnly) oder gibt die nicht zulässigen zusätzlichen Parameter an (PreventUsage).Identifies the connection string parameters as the only additional parameters allowed (AllowOnly), or identifies the additional parameters that are not allowed (PreventUsage). AllowOnly Der Standardwert ist.AllowOnly is the default. Wird von DBDataPermissionAttribute geerbt.Inherited from DBDataPermissionAttribute.
TypeID Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribut ab.Gets a unique identifier for this attribute when implemented in a derived class. Wird von Attribute geerbt.Inherited from Attribute.
Unrestricted Gibt an, ob für die Ressource uneingeschränkte Berechtigungen deklariert wurden.Indicates whether unrestricted permission to the resource is declared. Wird von SecurityAttribute geerbt.Inherited from SecurityAttribute.

Syntax von "ConnectionString"ConnectionString Syntax

Das folgende Beispiel zeigt, wie mithilfe des Elements connectionStrings einer Konfigurationsdatei nur eine bestimmte Verbindungszeichenfolge für die Verwendung zugelassen werden kann.The following example demonstrates how to use the connectionStrings element of a configuration file to allow only a specific connection string to be used. Finden Sie unter Verbindungszeichenfolgen für Weitere Informationen zu speichern und Abrufen von Verbindungszeichenfolgen aus Konfigurationsdateien.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>  

Syntax von "KeyRestrictions"KeyRestrictions Syntax

Im folgenden Beispiel wird dieselbe Verbindungszeichenfolge aktiviert, ermöglicht die Verwendung der Encrypt und Packet Size Verbindungszeichenfolge Verbindungszeichenfolgenoptionen die Verwendung von anderen Verbindungszeichenfolgenoptionen.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>  

Syntax von "KeyRestrictionBehavior" mit "PreventUsage"KeyRestrictionBehavior with PreventUsage Syntax

Im folgenden Beispiel wird dieselbe Verbindungszeichenfolge aktiviert, und alle anderen Verbindungsparameter bis auf User Id, Password und Persist Security Info werden zugelassen.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>  

Syntax von "KeyRestrictionBehavior" mit "AllowOnly"KeyRestrictionBehavior with AllowOnly Syntax

Im folgenden Beispiel werden zwei Verbindungszeichenfolgen aktiviert, die außerdem die Parameter Initial Catalog, Connection Timeout, Encrypt und Packet Size enthalten.The following example enables two connection strings that also contain Initial Catalog, Connection Timeout, Encrypt, and Packet Size parameters. Alle anderen Parameter für Verbindungszeichenfolgen werden nicht zugelassen.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>  

Aktivieren einer teilweisen Vertrauenswürdigkeit mit einem benutzerdefinierten BerechtigungssatzEnabling Partial Trust with a Custom Permission Set

Um die Verwendung der System.Data.SqlClient-Berechtigungen für eine bestimmte Zone zu aktivieren, muss ein Systemadministrator einen benutzerdefinierten Berechtigungssatz für eine bestimmte Zone erstellen.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. Standardberechtigungssätze wie LocalIntranet können nicht geändert werden.Default permission sets, such as LocalIntranet, cannot be modified. Beispielsweise enthalten System.Data.SqlClient Berechtigungen für Code mit einer Zone von LocalIntranet, ein Systemadministrator kann den Berechtigungssatz für kopieren LocalIntranet, in "CustomLocalIntranet" umbenennen, Hinzufügen der System.Data.SqlClient Berechtigungen importieren der Berechtigungssatz CustomLocalIntranet Berechtigungssatz mit den Caspol.exe (Code Access Security Policy-Tool), und legen Sie den Berechtigungssatz LocalIntranet_Zone auf 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.

BeispielberechtigungssatzSample Permission Set

Im Folgenden finden Sie einen Beispielberechtigungssatz für den .NET Framework-Datenanbieter für SQL Server in einem teilweise vertrauenswürdigen Szenario.The following is a sample permission set for the .NET Framework Data Provider for SQL Server in a partially trusted scenario. Informationen zum Erstellen von benutzerdefinierten Berechtigungssätzen finden Sie unter konfigurieren Berechtigung legt unter Verwendung von 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>  

Überprüfen des ADO.NET-Codezugriffs mit SicherheitsberechtigungenVerifying ADO.NET Code Access Using Security Permissions

In teilweise vertrauenswürdigen Szenarien können durch Angabe eines SqlClientPermissionAttribute für bestimmte Methoden im Code CAS-Berechtigungen verlangt werden.For partial-trust scenarios, you can require CAS privileges for particular methods in your code by specifying a SqlClientPermissionAttribute. Wenn diese Berechtigung aufgrund einer eingeschränkten Sicherheitsrichtlinie nicht gewährt wird, wird vor dem Ausführen des Codes eine Ausnahme ausgelöst.If that privilege is not allowed by the restricted security policy in effect, an exception is thrown before your code is run. Weitere Informationen zu Sicherheitsrichtlinien finden Sie unter Serversicherheits-richtlinienverwaltung und Security Policy Best Practices.For more information on security policy, see Security Policy Management and Security Policy Best Practices.

BeispielExample

Im folgenden Beispiel wird das Schreiben von Code gezeigt, durch den eine bestimmte Verbindungszeichenfolge verlangt wird.The following example demonstrates how to write code that requires a particular connection string. Der Code simuliert das Verweigern uneingeschränkter Berechtigungen für System.Data.SqlClient. Unter Praxisbedingungen würde dies durch eine CAS-Richtlinie implementiert werden.It simulates denying unrestricted permissions to System.Data.SqlClient, which a system administrator would implement using a CAS policy in the real world.

Wichtig

Die korrekte Vorgehensweise beim Entwerfen von CAS-Berechtigungen für ADO.NET besteht darin, vom restriktivsten Fall (gar keine Berechtigungen) auszugehen und dann nur die Berechtigungen hinzuzufügen, die für die konkreten auszuführenden Aufgaben erforderlich sind.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. Die umgekehrte Herangehensweise, also zuerst alle Berechtigungen zu gewähren und dann zu versuchen, eine bestimmte Berechtigung zu verweigern, ist dagegen unsicher, da ein und dieselbe Verbindungszeichenfolge auf verschiedene Art und Weise ausgedrückt werden kann.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. Wenn Sie z. B. alle Berechtigungen zulassen und dann die Verwendung der Verbindungszeichenfolge "server=someserver" zu verweigern versuchen, wäre die Zeichenfolge "server=someserver.mycompany.com" nach wie vor zulässig.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. Wenn Sie hingegen immer ohne jede Berechtigung beginnen, sinkt die Gefahr, dass der Berechtigungssatz Lücken enthält.By always starting by granting no permissions at all, you reduce the chances that there are holes in the permission set.

Der folgende Code zeigt, wie SqlClient die Sicherheitsanforderung ausführt, die eine SecurityException auslöst, wenn die entsprechenden CAS-Berechtigungen nicht vorhanden sind.The following code demonstrates how SqlClient performs the security demand, which throws a SecurityException if the appropriate CAS permissions are not in place. Die Ausgabe des SecurityException-Objekts wird im Konsolenfenster angezeigt.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
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

Im Konsolenfenster müsste nun die folgende Ausgabe angezeigt werden: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.  

Interoperabilität mit nicht verwaltetem CodeInteroperability with Unmanaged Code

Code, der außerhalb der CLR ausgeführt wird, wird als nicht verwalteter Code bezeichnet.Code that runs outside the CLR is called unmanaged code. Deshalb können Sicherheitsmechanismen, z. B. CAS, auf nicht verwalteten Code nicht angewendet werden.Therefore, security mechanisms such as CAS cannot be applied to unmanaged code. Beispiele für nicht verwalteten Code sind COM-Komponenten, ActiveX-Schnittstellen und Windows API-Funktionen.COM components, ActiveX interfaces, and Windows API functions are examples of unmanaged code. Damit bei der Ausführung von nicht verwaltetem Code die Gesamtsicherheit der Anwendung nicht gefährdet wird, sind besondere Sicherheitsüberlegungen notwendig.Special security considerations apply when executing unmanaged code so that you do not jeopardize overall application security. Weitere Informationen finden Sie unter Interoperation mit nicht verwaltetem Code.For more information, see Interoperating with Unmanaged Code.

.NET Framework unterstützt den Zugriff durch COM-Interop, um die Abwärtskompatibilität zu vorhandenen COM-Komponenten sicherzustellen.The .NET Framework also supports backward compatibility to existing COM components by providing access through COM interop. Sie können COM-Komponenten in eine .NET Framework-Anwendung einbauen, indem Sie die entsprechenden COM-Typen mit den COM-Interop-Tools importieren.You can incorporate COM components into a .NET Framework application by using COM interop tools to import the relevant COM types. Nach dem Import sind die COM-Typen einsatzbereit.Once imported, the COM types are ready to use. COM-Interop ermöglicht es COM-Clients auch, auf verwalteten Code zuzugreifen, indem Assemblymetadaten in eine Typbibliothek exportiert und die verwalteten Komponenten als COM-Komponente registriert werden.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. Weitere Informationen finden Sie unter Erweiterte COM-Interoperabilität.For more information, see Advanced COM Interoperability.

Siehe auchSee also