Sicurezza dell'accesso al codice e ADO.NETCode Access Security and ADO.NET

In .NET Framework sono incluse sia la sicurezza basata sui ruoli che la sicurezza dall'accesso di codice (CAS, Code Access Security), entrambe implementate usando un'infrastruttura comune fornita da CLR (Common Language Runtime).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 un contesto di codice non gestito la maggior parte delle applicazioni viene eseguita con le autorizzazioni dell'utente o entità di sicurezza.In the world of unmanaged code, most applications execute with the permissions of the user or principal. Di conseguenza, quando un utente con privilegi elevati esegue software dannoso o con errori possono verificarsi danni al sistemi del computer e ai dati privati.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.

Al contrario, il codice gestito eseguito in .NET Framework include la sicurezza dall'accesso di codice, che viene applicata al solo codice.By contrast, managed code executing in the .NET Framework includes code access security, which applies to code alone. L'esecuzione del codice verrà pertanto consentita in base all'origine o ad altri aspetti dell'identità del codice e non unicamente in base all'identità dell'entità di sicurezza.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. In tal modo si riduce la probabilità di uso improprio del codice gestito.This reduces the likelihood that managed code can be misused.

Autorizzazioni di accesso al codiceCode Access Permissions

Quando si esegue il codice, viene presentata l'evidenza restituita dal sistema di sicurezza di CLR.When code is executed, it presents evidence that is evaluated by the CLR security system. In genere, tale evidenza comprende l'origine del codice, l'URL, il sito Web, l'area e le firme digitali che garantiscono l'identità dell'assembly.Typically, this evidence comprises the origin of the code including URL, site, and zone, and digital signatures that ensure the identity of the assembly.

CLR consente al codice di eseguire solo le operazioni che il codice è autorizzato a eseguire.The CLR allows code to perform only those operations that the code has permission to perform. Il codice può richiedere delle autorizzazioni e tali richieste vengono eseguite in base al criterio di sicurezza impostato da un amministratore.Code can request permissions, and those requests are honored based on the security policy set by an administrator.

Nota

Il codice eseguito in CLR non può concedere autorizzazioni a se stesso.Code executing in the CLR cannot grant permissions to itself. Il codice può ad esempio richiedere e ottenere un numero di autorizzazioni inferiore, ma non superiore, rispetto a quello consentito da un criterio di sicurezza.For example, code can request and be granted fewer permissions than a security policy allows, but it will never be granted more permissions. Quando si concedono autorizzazioni, iniziare senza autorizzazioni, quindi aggiungere le autorizzazioni minime per la specifica attività da eseguire.When granting permissions, start with no permissions at all and then add the narrowest permissions for the particular task being performed. Se invece si negano singole autorizzazioni dopo aver iniziato concedendole tutte, le applicazioni potrebbero risultare non protette e contenere problemi di sicurezza non intenzionali derivanti dalla concessione di un numero di autorizzazioni maggiore di quello necessario.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. Per ulteriori informazioni, vedere NIB: configurazione dei criteri di sicurezza e NIB: Gestione criteri di protezione.For more information, see NIB: Configuring Security Policy and NIB: Security Policy Management.

Sono disponibili tre tipi di autorizzazioni di accesso al codice:There are three types of code access permissions:

  • Code access permissions, che derivano dalla classe CodeAccessPermission.Code access permissions derive from the CodeAccessPermission class. Le autorizzazioni sono necessarie per accedere a risorse protette, ad esempio file e variabili di ambiente, nonché per eseguire operazioni protette, ad esempio l'accesso a codice non gestito.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, che rappresentano le caratteristiche identificative di un assembly.Identity permissions represent characteristics that identify an assembly. Le autorizzazioni vengono concesse a un assembly in base a una prova, che può includere elementi quali una firma digitale o l'origine del codice.Permissions are granted to an assembly based on evidence, which can include items such as a digital signature or where the code originated. Le autorizzazioni di identità derivano anche dalla classe base CodeAccessPermission.Identity permissions also derive from the CodeAccessPermission base class.

  • Role-based security permissions, che variano a seconda che un'entità di sicurezza disponga di un'identità specificata o sia membro di un ruolo specificato.Role-based security permissions are based on whether a principal has a specified identity or is a member of a specified role. La classe PrincipalPermission consente l'esecuzione di controlli di autorizzazione dichiarativi e imperativi sull'entità di sicurezza attiva.The PrincipalPermission class allows both declarative and imperative permission checks against the active principal.

Per determinare se il codice è autorizzato ad accedere a una risorsa o a eseguire un'operazione, il sistema di sicurezza del runtime attraversa lo stack di chiamate, confrontando le autorizzazioni concesse di ogni chiamante con l'autorizzazione richiesta.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. Se un qualsiasi chiamante nello stack di chiamate non dispone dell'autorizzazione richiesta, viene generata un'eccezione SecurityException e l'accesso viene rifiutato.If any caller in the call stack does not have the demanded permission, a SecurityException is thrown and access is refused.

Richiesta di autorizzazioniRequesting Permissions

Lo scopo della richiesta di autorizzazioni è informare il runtime delle autorizzazioni richieste per eseguire l'applicazione e garantire che riceva solo le autorizzazioni effettivamente necessarie.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. Ad esempio, se l'applicazione deve scrivere dati sul disco locale, richiederà FileIOPermission.For example, if your application needs to write data to the local disk, it requires FileIOPermission. Se tale autorizzazione non è stata concessa, l'applicazione non riuscirà a scrivere sul disco.If that permission hasn't been granted, the application will fail when it attempts to write to the disk. Se tuttavia l'applicazione richiede FileIOPermission e tale autorizzazione non è stata concessa, l'applicazione genererà l'eccezione all'inizio e non verrà caricata.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 uno scenario in cui l'applicazione deve solo leggere dati dal disco, è possibile richiedere che non venga mai concessa alcuna autorizzazione di scrittura.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. In caso di bug o attacco dannoso, il codice non potrà quindi danneggiare i dati su cui opera.In the event of a bug or a malicious attack, your code cannot damage the data on which it operates. Per ulteriori informazioni, vedere NIB: richiesta di autorizzazioni.For more information, see NIB: Requesting Permissions.

Sicurezza basata sui ruoli e CASRole-Based Security and CAS

L'implementazione della sicurezza basata sui ruoli e della sicurezza dall'accesso di codice (CAS) consente di migliorare la sicurezza complessiva dell'applicazione.Implementing both role-based security and code-accessed security (CAS) enhances overall security for your application. La sicurezza basata sui ruoli può essere impostata su un account di Windows o un'identità personalizzata, in modo da rendere le informazioni sull'entità di sicurezza disponibili al thread corrente.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. È inoltre necessario che le applicazioni concedano l'accesso a dati o risorse in base alle credenziali fornite dall'utente.In addition, applications are often required to provide access to data or resources based on credentials supplied by the user. In genere, queste applicazioni controllano il ruolo di un utente e consentono l'accesso alle risorse sulla base di tale ruolo.Typically, such applications check the role of a user and provide access to resources based on those roles.

La sicurezza basata sui ruoli consente a un componente di identificare gli utenti correnti e i relativi ruoli associati in fase di esecuzione.Role-based security enables a component to identify current users and their associated roles at run time. Queste informazioni vengono quindi mappate usando un criterio CAS per determinare il set di autorizzazioni concesse in fase di esecuzione.This information is then mapped using a CAS policy to determine the set of permissions granted at run time. Per un dominio dell'applicazione specificato, l'host può modificare il criterio di sicurezza basato sui ruoli predefinito e impostare un'entità di sicurezza predefinita che rappresenta un utente e i ruoli ad esso associati.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.

CLR usa le autorizzazioni per implementare il proprio meccanismo di applicazione delle restrizioni sul codice gestito.The CLR uses permissions to implement its mechanism for enforcing restrictions on managed code. Le autorizzazioni di sicurezza basate sui ruoli offrono un meccanismo per individuare se un utente (o l'agente che opera per conto dell'utente) dispone di una specifica identità o è membro di un ruolo specificato.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. Per ulteriori informazioni, vedere le autorizzazioni di sicurezza.For more information, see Security Permissions.

A seconda del tipo di applicazione che si intende compilare, è opportuno considerare l'implementazione di autorizzazioni basate sui ruoli anche nel database.Depending on the type of application you are building, you should also consider implementing role-based permissions in the database. Per ulteriori informazioni sulla sicurezza basata sui ruoli in SQL Server, vedere sicurezza di SQL Server.For more information on role-based security in SQL Server, see SQL Server Security.

AssemblyAssemblies

Gli assembly costituiscono l'unità fondamentale della distribuzione, del controllo della versione, del riutilizzo, dell'ambito di attivazione e delle autorizzazioni di sicurezza per un'applicazione .NET Framework.Assemblies form the fundamental unit of deployment, version control, reuse, activation scoping, and security permissions for a .NET Framework application. Un assembly fornisce infatti una raccolta di tipi e risorse che interagiscono tra loro e costituiscono un'unità logica della funzionalità.An assembly provides a collection of types and resources that are built to work together and form a logical unit of functionality. Per CLR un tipo non esiste al di fuori del contesto di un assembly.To the CLR, a type does not exist outside the context of an assembly. Per ulteriori informazioni sulla creazione e distribuzione di assembly, vedere programmazione con assembly.For more information on creating and deploying assemblies, see Programming with Assemblies.

Assegnazione di nomi sicuri agli assemblyStrong-naming Assemblies

Un nome sicuro, o firma digitale, è costituito dall'identità dell'assembly, che include il nome in testo semplice, il numero di versione e informazioni sulle impostazioni cultura (se fornite), nonché una chiave pubblica e una firma digitale.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. La firma digitale viene generata da un file di assembly usando la chiave privata corrispondente.The digital signature is generated from an assembly file using the corresponding private key. Il file di assembly contiene il manifesto dell'assembly, contenente i nomi e gli hash di tutti i file che costituiscono l'assembly.The assembly file contains the assembly manifest, which contains the names and hashes of all the files that make up the assembly.

L'assegnazione di nomi sicuri consente a un'applicazione o a un componente di disporre di un'identità univoca utilizzabile da altri software per riferirsi esplicitamente a tale applicazione o componente.Strong naming an assembly gives an application or component a unique identity that other software can use to refer explicitly to it. Consente inoltre di proteggere gli assembly dallo spoofing da parte di un assembly contenente codice dannosoStrong naming guards assemblies against being spoofed by an assembly that contains hostile code. e garantisce la compatibilità tra diverse versioni di un componente.Strong-naming also ensures versioning consistency among different versions of a component. Agli assembly che verranno distribuiti nella Global Assembly Cache (GAC) deve essere assegnato un nome sicuro.You must strong name assemblies that will be deployed to the Global Assembly Cache (GAC). Per altre informazioni, vedere Creazione e utilizzo degli assembly con nome sicuro.For more information, see Creating and Using Strong-Named Assemblies.

Attendibilità parziale in ADO.NET 2.0Partial Trust in ADO.NET 2.0

Con ADO.NET 2.0 i provider di dati .NET Framework per SQL Server, per OLE DB, per ODBC e per Oracle possono essere eseguiti in ambienti ad attendibilità parziale.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. Nelle versioni precedenti di .NET Framework le applicazioni non totalmente attendibili supportavano solo System.Data.SqlClient.In previous releases of the .NET Framework, only System.Data.SqlClient was supported in less than full-trust applications.

Un'applicazione ad attendibilità parziale che usa il provider per SQL Server deve disporre almeno delle autorizzazioni minime di esecuzione e di SqlClientPermission.At minimum, a partially trusted application using the SQL Server provider must have execution and SqlClientPermission permissions.

Proprietà dell'attributo di autorizzazione per l'attendibilità parzialePermission Attribute Properties for Partial Trust

Per gli scenari ad attendibilità parziale, è possibile usare i membri di SqlClientPermissionAttribute per restringere ulteriormente le funzionalità a disposizione del provider di dati .NET Framework per 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.

Nella tabella seguente vengono elencate le proprietà disponibili per la classe SqlClientPermissionAttribute e le relative descrizioni:The following table lists the available SqlClientPermissionAttribute properties and their descriptions:

Proprietà dell'attributo di autorizzazionePermission attribute property DescrizioneDescription
Action Ottiene o imposta un'azione di sicurezza.Gets or sets a security action. La proprietà viene ereditata da SecurityAttribute.Inherited from SecurityAttribute.
AllowBlankPassword Viene usata per consentire o meno l'immissione di una password vuota in una stringa di connessione.Enables or disables the use of a blank password in a connection string. Valori validi sono true, per consentire l'uso di password vuote, e false, per impedire l'uso di password vuote.Valid values are true (to enable the use of blank passwords) and false (to disable the use of blank passwords). La proprietà viene ereditata da DBDataPermissionAttribute.Inherited from DBDataPermissionAttribute.
ConnectionString Viene usata per identificare una stringa di connessione consentita.Identifies a permitted connection string. È possibile identificare più stringhe di connessione.Multiple connection strings can be identified. Nota: non includono un ID utente o una password nella stringa di connessione.Note: Do not include a user ID or password in your connection string. In questa versione non è possibile modificare le restrizioni relative alle stringhe di connessione usando lo strumento Configurazione .NET Framework.In this release, you cannot change connection string restrictions using the .NET Framework Configuration Tool.

La proprietà viene ereditata da DBDataPermissionAttribute.Inherited from DBDataPermissionAttribute.
KeyRestrictions Viene usata per identificare i parametri delle stringhe di connessione consentiti o non consentiti.Identifies connection string parameters that are allowed or disallowed. Parametri di stringa di connessione vengono identificati nel formato <nome parametro > =.Connection string parameters are identified in the form <parameter name>=. Per specificare più parametri, separarli con un punto e virgola (;).Multiple parameters can be specified, delimited using a semicolon (;). Nota: se non si specifica KeyRestrictions, ma è impostare KeyRestrictionBehavior proprietà AllowOnly o PreventUsage, alcun parametro di stringa di connessione aggiuntive non è consentite.Note: If you do not specify KeyRestrictions, but you set KeyRestrictionBehavior property to AllowOnly or PreventUsage, no additional connection string parameters are allowed. La proprietà viene ereditata da DBDataPermissionAttribute.Inherited from DBDataPermissionAttribute.
KeyRestrictionBehavior Viene usata per identificare i parametri della stringa di connessione come unici parametri aggiuntivi consentiti (AllowOnly) oppure per identificare i parametri aggiuntivi non consentiti (PreventUsage).Identifies the connection string parameters as the only additional parameters allowed (AllowOnly), or identifies the additional parameters that are not allowed (PreventUsage). Il valore predefinito è AllowOnly.AllowOnly is the default. La proprietà viene ereditata da DBDataPermissionAttribute.Inherited from DBDataPermissionAttribute.
TypeID Ottiene un identificatore univoco per l'attributo quando viene implementato in una classe derivata.Gets a unique identifier for this attribute when implemented in a derived class. La proprietà viene ereditata da Attribute.Inherited from Attribute.
Unrestricted Indica che esiste una dichiarazione di accesso senza limitazioni alla risorsa.Indicates whether unrestricted permission to the resource is declared. La proprietà viene ereditata da SecurityAttribute.Inherited from SecurityAttribute.

Sintassi di ConnectionStringConnectionString Syntax

Nell'esempio seguente viene illustrato come usare l'elemento connectionStrings di un file di configurazione per consentire l'uso solo di una stringa di connessione specifica.The following example demonstrates how to use the connectionStrings element of a configuration file to allow only a specific connection string to be used. Vedere le stringhe di connessione per ulteriori informazioni sull'archiviazione e recupero di stringhe di connessione dai file di configurazione.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>  

Sintassi di KeyRestrictionsKeyRestrictions Syntax

Nell'esempio seguente abilita la stessa stringa di connessione, consente di utilizzare il Encrypt e Packet``Size stringa di connessione, ma impedisce l'uso di altre opzioni di stringa di connessione.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 con sintassi di PreventUsageKeyRestrictionBehavior with PreventUsage Syntax

Nell'esempio seguente viene abilitata la stringa di connessione sopra riportata e vengono consentiti tutti gli altri parametri di connessione ad eccezione di User Id, Password e 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 con sintassi di AllowOnlyKeyRestrictionBehavior with AllowOnly Syntax

L'esempio seguente abilita due stringhe di connessione contenenti anche i parametri Initial Catalog, Connection Timeout, Encrypt e Packet Size.The following example enables two connection strings that also contain Initial Catalog, Connection Timeout, Encrypt, and Packet Size parameters. Tutti gli altri parametri di stringa di connessione non sono consentiti.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>  

Abilitazione dell'attendibilità parziale con un set di autorizzazioni personalizzatoEnabling Partial Trust with a Custom Permission Set

Per usare le autorizzazioni System.Data.SqlClient per un'area particolare, è necessario che un amministratore di sistema crei un set di autorizzazioni personalizzato e lo imposti come set di autorizzazioni per tale area.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. I set di autorizzazioni predefiniti, ad esempio LocalIntranet, non possono essere modificati.Default permission sets, such as LocalIntranet, cannot be modified. Ad esempio, per includere System.Data.SqlClient le autorizzazioni per il codice che ha un Zone di LocalIntranet, un amministratore di sistema è stato possibile copiare il set di autorizzazioni per LocalIntranet, rinominarlo in "CustomLocalIntranet", aggiungere il System.Data.SqlClient autorizzazioni, importazione il set di autorizzazioni di CustomLocalIntranet il Caspol.exe (strumento di criteri di sicurezza di accesso di codice)e impostare il set di autorizzazioni di LocalIntranet_Zone per 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.

Set di autorizzazioni di esempioSample Permission Set

Di seguito è riportato un set di autorizzazioni di esempio per il provider di dati .NET Framework per SQL Server in uno scenario ad attendibilità parziale.The following is a sample permission set for the .NET Framework Data Provider for SQL Server in a partially trusted scenario. Per informazioni sulla creazione di set di autorizzazioni personalizzati, vedere NIB: configurazione di autorizzazione imposta utilizzando Caspol.exe.For information on creating custom permission sets, see NIB: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>  

Verifica dell'accesso di codice ADO.NET tramite le autorizzazioni di sicurezzaVerifying ADO.NET Code Access Using Security Permissions

Per scenari ad attendibilità parziale, è possibile identificare nel codice metodi particolari quali la richiesta di un determinato privilegio di sicurezza dall'accesso di codice specificando una proprietà SqlClientPermissionAttribute.For partial-trust scenarios, you can require CAS privileges for particular methods in your code by specifying a SqlClientPermissionAttribute. Se tale privilegio non è consentito dalle restrizioni dei criteri di sicurezza, verrà generata un'eccezione prima dell'esecuzione del codice.If that privilege is not allowed by the restricted security policy in effect, an exception is thrown before your code is run. Per ulteriori informazioni sui criteri di sicurezza, vedere NIB: Gestione criteri di protezione e NIB: procedure consigliate per criteri di sicurezza.For more information on security policy, see NIB: Security Policy Management and NIB: Security Policy Best Practices.

EsempioExample

Nell'esempio seguente viene illustrato come scrivere codice che richieda una stringa di connessione particolare.The following example demonstrates how to write code that requires a particular connection string. Tale codice consente di simulare la negazione a System.Data.SqlClient di autorizzazioni senza restrizioni, che in realtà verrebbero implementate da un amministratore di sistema tramite i criteri di sicurezza dall'accesso di codice.It simulates denying unrestricted permissions to System.Data.SqlClient, which a system administrator would implement using a CAS policy in the real world.

Importante

Quando si progettano le autorizzazioni di sicurezza dall'accesso di codice per ADO.NET, è consigliabile iniziare dal caso più restrittivo (nessuna autorizzazione) e aggiungere le autorizzazioni specifiche necessarie per l'attività particolare che deve essere eseguita dal codice.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. Al contrario, non è sicuro concedere inizialmente tutte le autorizzazioni e successivamente negare un'autorizzazione specifica, poiché la stessa stringa di connessione può essere espressa in molti modi diversi.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. Ad esempio, se inizialmente si concedono tutte le autorizzazioni e successivamente si tenta di negare l'uso della stringa di connessione "server=nomeserver", verrà comunque consentito l'uso della stringa "server=nomeserver.società.com".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. Al contrario, se all'inizio non si concede alcuna autorizzazione, si ridurrà la possibilità di problemi di sicurezza nel set di autorizzazioni.By always starting by granting no permissions at all, you reduce the chances that there are holes in the permission set.

Nel codice seguente viene illustrato come SqlClient esegue la richiesta di sicurezza, che genera una SecurityException se non sono impostate le autorizzazioni di sicurezza dall'accesso di codice appropriate.The following code demonstrates how SqlClient performs the security demand, which throws a SecurityException if the appropriate CAS permissions are not in place. Nella finestra della console verrà visualizzato l'output di SecurityException.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

Nella finestra della console verrà visualizzato il seguente output: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à con codice non gestitoInteroperability with Unmanaged Code

Il codice che non viene eseguito con CLR viene denominato codice non gestito.Code that runs outside the CLR is called unmanaged code. Non è pertanto possibile applicare al codice non gestito meccanismi di sicurezza quali la sicurezza dall'accesso di codice (CAS).Therefore, security mechanisms such as CAS cannot be applied to unmanaged code. Esempi di codice non gestito sono i componenti COM, le interfacce ActiveX e le funzioni dell'API Win32.COM components, ActiveX interfaces, and Win32 API functions are examples of unmanaged code. Quando si esegue codice non gestito, è necessario applicare considerazioni specifiche relative alla sicurezza al fine di non compromettere la sicurezza dell'applicazione.Special security considerations apply when executing unmanaged code so that you do not jeopardize overall application security. Per altre informazioni, vedere Interoperabilità con codice non gestito.For more information, see Interoperating with Unmanaged Code.

In .NET Framework la compatibilità con versioni precedenti di componenti COM esistenti viene supportata fornendo l'accesso tramite l'interoperabilità COM.The .NET Framework also supports backward compatibility to existing COM components by providing access through COM interop. È possibile incorporare componenti COM in un'applicazione .NET Framework usando gli strumenti di interoperabilità COM per importare i tipi COM attinenti.You can incorporate COM components into a .NET Framework application by using COM interop tools to import the relevant COM types. Una volta importati, i tipi COM sono pronti per l'uso.Once imported, the COM types are ready to use. L'interoperabilità COM consente anche ai client COM di accedere a codice gestito esportando i metadati dell'assembly in una libreria dei tipi e registrando il componente gestito come componente 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. Per ulteriori informazioni, vedere interoperabilità COM avanzata.For more information, see Advanced COM Interoperability.

Vedere ancheSee Also

Protezione delle applicazioni ADO.NETSecuring ADO.NET Applications
PAVE Security in Native and .NET Framework Code (PAVE: Sicurezza nel codice nativo e .NET Framework)PAVE Security in Native and .NET Framework Code
Sicurezza dall'accesso di codiceCode Access Security
Sicurezza basata sui ruoliRole-Based Security
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center