Delen via


Verbindingsreeksen en configuratiebestanden

Van toepassing op: .NET Framework .NET

ADO.NET downloaden

Het insluiten van verbindingsreeks s in de code van uw toepassing kan leiden tot beveiligingsproblemen en onderhoudsproblemen. Niet-versleutelde verbindingsreeks die zijn gecompileerd in de broncode van een toepassing, kunnen worden weergegeven met behulp van het hulpprogramma Ildasm.exe (IL Disassembler). Bovendien moet uw toepassing opnieuw worden gecompileerd als de verbindingsreeks ooit wordt gewijzigd. Daarom raden we u aan verbindingsreeks s op te slaan in een toepassingsconfiguratiebestand.

Werken met toepassingsconfiguratiebestanden

Toepassingsconfiguratiebestanden bevatten instellingen die specifiek zijn voor een bepaalde toepassing. Een ASP.NET-toepassing kan bijvoorbeeld een of meer web.config-bestanden hebben en een Windows-toepassing kan een optioneel app.config-bestand hebben. Configuratiebestanden delen algemene elementen, hoewel de naam en locatie van een configuratiebestand variëren, afhankelijk van de host van de toepassing.

De sectie connectionStrings

Verbindingsreeksen kunnen worden opgeslagen als sleutel-waardeparen in de sectie connectionStrings van het configuratie-element van een toepassingsconfiguratiebestand. Onderliggende elementen zijn onder andere toevoegen, wissen en verwijderen.

In het volgende fragment van het configuratiebestand ziet u het schema en de syntaxis voor het opslaan van een verbindingsreeks. Het naamkenmerk is een naam die u opgeeft om een verbindingsreeks uniek te identificeren, zodat deze tijdens runtime kan worden opgehaald. De providerName is Microsoft.Data.SqlClient en gebruikt de Microsoft SqlClient Data Provider voor SQL Server.

<?xml version='1.0' encoding='utf-8'?>  
  <configuration>  
    <connectionStrings>  
      <clear />  
      <add name="Name"
       providerName="Microsoft.Data.SqlClient"
       connectionString="Valid Connection String;" />  
    </connectionStrings>  
  </configuration>  

Opmerking

U kunt een deel van een verbindingsreeks opslaan in een configuratiebestand en de DbConnectionStringBuilder klasse gebruiken om dit tijdens runtime te voltooien. Dit is handig in scenario's waarin u vooraf geen elementen van de verbindingsreeks kent of wanneer u gevoelige informatie niet in een configuratiebestand wilt opslaan. Zie Verbindingsreeksbouwers voor meer informatie.

Externe configuratiebestanden gebruiken

Externe configuratiebestanden zijn afzonderlijke bestanden die een fragment van een configuratiebestand bevatten dat bestaat uit één sectie. Er wordt vervolgens naar het externe configuratiebestand verwezen door het hoofdconfiguratiebestand. Het opslaan van de sectie connectionStrings in een fysiek afzonderlijk bestand is handig in situaties waarin verbindingsreeksen kunnen worden bewerkt nadat de toepassing is geïmplementeerd. Het standaardgedrag ASP.NET is bijvoorbeeld het opnieuw opstarten van een toepassingsdomein wanneer configuratiebestanden worden gewijzigd, wat ertoe leidt dat statusgegevens verloren gaan. Als u echter een extern configuratiebestand wijzigt, wordt de toepassing niet opnieuw opgestart. Externe configuratiebestanden zijn niet beperkt tot ASP.NET; ze kunnen ook worden gebruikt door Windows-toepassingen. Daarnaast kunnen beveiliging en machtigingen voor bestandstoegang worden gebruikt om de toegang tot externe configuratiebestanden te beperken. Werken met externe configuratiebestanden tijdens runtime is transparant en vereist geen speciale codering.

Als u verbindingsreeksen in een extern configuratiebestand wilt opslaan, maakt u een afzonderlijk bestand dat alleen de sectie connectionStrings bevat. Voeg geen extra elementen, secties of kenmerken toe. In dit voorbeeld ziet u de syntaxis voor een extern configuratiebestand.

<connectionStrings>  
  <add name="Name"
   providerName="Microsoft.Data.SqlClient"
   connectionString="Valid Connection String;" />  
</connectionStrings>  

In het configuratiebestand van de hoofdtoepassing gebruikt u het kenmerk configSource om de volledig gekwalificeerde naam en locatie van het externe bestand op te geven. In dit voorbeeld wordt verwezen naar een extern configuratiebestand met de naam connections.config.

<?xml version='1.0' encoding='utf-8'?>  
<configuration>  
    <connectionStrings configSource="connections.config"/>  
</configuration>  

Verbindingsreeksen ophalen tijdens runtime

In .NET Framework 2.0 zijn nieuwe klassen in de System.Configuration naamruimte geïntroduceerd om het ophalen van verbindingsreeksen uit configuratiebestanden tijdens runtime te vereenvoudigen. U kunt programmatisch een verbindingsreeks ophalen op naam of op providernaam.

Opmerking

Het bestandmachine.config bevat ook een sectie connectionStrings , die verbindingsreeksen bevat die worden gebruikt door Visual Studio. Bij het ophalen van verbindingsreeksen door middel van de providernaam uit het app.config-bestand in een Windows-toepassing, worden de verbindingsreeksen in machine.config eerst geladen en vervolgens de vermeldingen uit app.config. Door clear direct na het connectionStrings element toe te voegen, worden alle overgenomen verwijzingen uit de geheugenstructuur verwijderd, zodat alleen de lokaal gedefinieerde verbindingsreeksen in het app.config-bestand worden overwogen.

Werken met de configuratiebestanden

Vanaf .NET Framework 2.0 wordt ConfigurationManager gebruikt bij het werken met configuratiebestanden op de lokale computer, ter vervanging van de gedeprecieerde ConfigurationSettings. WebConfigurationManager wordt gebruikt om te werken met ASP.NET configuratiebestanden. Het is ontworpen om te werken met configuratiebestanden op een webserver en maakt programmatische toegang tot configuratiebestandsecties zoals system.web mogelijk.

Opmerking

Voor het openen van configuratiebestanden tijdens runtime moeten machtigingen worden verleend aan de beller; de vereiste machtigingen zijn afhankelijk van het type toepassing, configuratiebestand en locatie. Zie De configuratieklassen en WebConfigurationManager voor ASP.NET toepassingen en ConfigurationManager voor Windows-toepassingen gebruiken voor meer informatie.

U kunt de functie ConnectionStringSettingsCollection gebruiken om verbindingsreeks s op te halen uit toepassingsconfiguratiebestanden. Het bevat een verzameling ConnectionStringSettings objecten, die elk één vermelding in de sectie connectionStrings vertegenwoordigt . De eigenschappen zijn toegewezen aan verbindingsreeks kenmerken, zodat u een verbindingsreeks kunt ophalen door de naam of de providernaam op te geven.

Vastgoed Description
Name De naam van de verbindingsreeks. Komt overeen met het name attribuut.
ProviderName De volledig gekwalificeerde providernaam. Komt overeen met het kenmerk providerName.
ConnectionString De verbindingsreeks. Komt overeen met het kenmerk connectionString.

Voorbeeld: alle verbindingsreeksen weergeven

In dit voorbeeld wordt er door de ConnectionStringSettingsCollection gelopen en worden de eigenschappen ConnectionStringSettings.Name, ConnectionStringSettings.ProviderName, en ConnectionStringSettings.ConnectionString in het consolevenster weergegeven.

Opmerking

System.Configuration.dll is niet opgenomen in alle projecttypenbestanden en u moet mogelijk een verwijzing ernaar instellen om de configuratieklassen te gebruiken. De naam en locatie van een bepaald toepassingsconfiguratiebestand varieert per type toepassing en het hostingproces.

using System.Configuration;

class Program
{
    static void Main()
    {
        GetConnectionStrings();
        Console.ReadLine();
    }

    static void GetConnectionStrings()
    {
        ConnectionStringSettingsCollection settings =
            ConfigurationManager.ConnectionStrings;

        if (settings != null)
        {
            foreach(ConnectionStringSettings cs in settings)
            {
                Console.WriteLine(cs.Name);
                Console.WriteLine(cs.ProviderName);
                Console.WriteLine(cs.ConnectionString);
            }
        }
    }
}

Voorbeeld: een verbindingsreeks ophalen op naam

In dit voorbeeld ziet u hoe u een verbindingsreeks ophaalt uit een configuratiebestand door de naam op te geven. Met de code wordt een ConnectionStringSettings object gemaakt dat overeenkomt met de opgegeven invoerparameter op de ConnectionStrings naam. Als er geen overeenkomende naam wordt gevonden, retourneert null de functie (Nothing in Visual Basic).

// Retrieves a connection string by name.
// Returns null if the name is not found.
static string GetConnectionStringByName(string name)
{
    // Assume failure.
    string returnValue = null;

    // Look for the name in the connectionStrings section.
    ConnectionStringSettings settings =
        ConfigurationManager.ConnectionStrings[name];

    // If found, return the connection string.
    if (settings != null)
        returnValue = settings.ConnectionString;

    return returnValue;
}

Voorbeeld: Een verbindingsreeks ophalen op providernaam

In dit voorbeeld ziet u hoe u een verbindingsreeks ophaalt door de providernaam op te geven in de indeling Microsoft.Data.SqlClient. De code doorloopt de ConnectionStringSettingsCollection en retourneert de verbindingsreeks voor de eerste ProviderName die gevonden wordt. Als de providernaam niet wordt gevonden, retourneert de functie null (Nothing in Visual Basic).

// Retrieve a connection string by specifying the providerName.
// Assumes one connection string per provider in the config file.
static string GetConnectionStringByProvider(string providerName)
{
    // Return null on failure.
    string returnValue = null;

    // Get the collection of connection strings.
    ConnectionStringSettingsCollection settings =
        ConfigurationManager.ConnectionStrings;

    // Walk through the collection and return the first
    // connection string matching the providerName.
    if (settings != null)
    {
        foreach (ConnectionStringSettings cs in settings)
        {
            if (cs.ProviderName == providerName)
                returnValue = cs.ConnectionString;
            break;
        }
    }
    return returnValue;
}

Secties van configuratiebestanden versleutelen met behulp van beveiligde configuratie

ASP.NET 2.0 een nieuwe functie geïntroduceerd, beveiligde configuratie genoemd, waarmee u gevoelige informatie in een configuratiebestand kunt versleutelen. Hoewel deze voornamelijk is ontworpen voor ASP.NET, kan beveiligde configuratie ook worden gebruikt om secties van configuratiebestanden in Windows-toepassingen te versleutelen. Zie Configuratiegegevens versleutelen met behulp van beveiligde configuratie voor een gedetailleerde beschrijving van de beveiligde configuratiemogelijkheden.

In het volgende fragment van het configuratiebestand ziet u de sectie connectionStrings nadat het is versleuteld. De configProtectionProvider specificeert de beveiligde configuratieprovider die wordt gebruikt voor het versleutelen en ontsleutelen van de verbindingsreeksen. De sectie EncryptedData bevat de coderingstekst.

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">  
  <EncryptedData>  
    <CipherData>  
      <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAH2... </CipherValue>  
    </CipherData>  
  </EncryptedData>  
</connectionStrings>  

Wanneer de versleutelde verbindingsreeks tijdens runtime wordt opgehaald, gebruikt .NET Framework de opgegeven provider om de CipherValue te ontsleutelen en beschikbaar te maken voor uw toepassing. U hoeft geen extra code te schrijven om het ontsleutelingsproces te beheren.

Beveiligde configuratieproviders

Beveiligde configuratieproviders worden geregistreerd in de sectie configProtectedData van het machine.config-bestand op de lokale computer, zoals wordt weergegeven in het volgende fragment, waarin de twee beveiligde configuratieproviders worden weergegeven die zijn geleverd met .NET Framework. De hier weergegeven waarden zijn afgekapt voor leesbaarheid.

<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">  
  <providers>  
    <add name="RsaProtectedConfigurationProvider"
      type="System.Configuration.RsaProtectedConfigurationProvider" />  
    <add name="DataProtectionConfigurationProvider"
      type="System.Configuration.DpapiProtectedConfigurationProvider" />  
  </providers>  
</configProtectedData>  

U kunt extra beveiligde configuratieproviders configureren door ze toe te voegen aan het bestand machine.config . U kunt ook uw eigen beveiligde configuratieprovider maken door deze over te nemen van de ProtectedConfigurationProvider abstracte basisklasse. In de volgende tabel worden de twee configuratiebestanden beschreven die zijn opgenomen in .NET Framework.

Provider Description
RsaProtectedConfigurationProvider Maakt gebruik van het RSA-versleutelingsalgoritmen voor het versleutelen en ontsleutelen van gegevens. Het RSA-algoritme kan worden gebruikt voor zowel versleuteling van openbare sleutels als digitale handtekeningen. Het wordt ook wel 'openbare sleutel' of asymmetrische versleuteling genoemd, omdat er twee verschillende sleutels worden gebruikt. U kunt het hulpprogramma voor ASP.NET IIS-registratie (Aspnet_regiis.exe) gebruiken om secties in een Web.config-bestand te versleutelen en de versleutelingssleutels te beheren. ASP.NET het configuratiebestand ontsleutelt wanneer het bestand wordt verwerkt. De identiteit van de ASP.NET-toepassing moet leestoegang hebben tot de versleutelingssleutel die wordt gebruikt voor het versleutelen en ontsleutelen van de versleutelde secties.
DpapiProtectedConfigurationProvider Maakt gebruik van de DPAPI (Windows Data Protection API) om configuratiesecties te versleutelen. Het maakt gebruik van de ingebouwde cryptografische Windows-services en kan worden geconfigureerd voor computerspecifieke of gebruikersaccountspecifieke beveiliging. Machinespecifieke beveiliging is handig voor meerdere toepassingen op dezelfde server die informatie moeten delen. Gebruikersaccountspecifieke beveiliging kan worden gebruikt met services die worden uitgevoerd met een specifieke gebruikersidentiteit, zoals een gedeelde hostingomgeving. Elke toepassing wordt uitgevoerd onder een afzonderlijke identiteit, waardoor de toegang tot resources, zoals bestanden en databases, wordt beperkt.

Beide providers bieden sterke versleuteling van gegevens. Als u echter van plan bent hetzelfde versleutelde configuratiebestand te gebruiken op meerdere servers, zoals een webfarm, kunt u alleen RsaProtectedConfigurationProvider de versleutelingssleutels exporteren die worden gebruikt om de gegevens te versleutelen en te importeren op een andere server. Zie Beveiligde RSA-sleutelcontainers importeren en exporteren voor meer informatie.

De configuratieklassen gebruiken

De System.Configuration naamruimte biedt klassen om programmatisch met configuratie-instellingen te werken. De ConfigurationManager klasse biedt toegang tot computer-, toepassings- en gebruikersconfiguratiebestanden. Als u een ASP.NET-toepassing maakt, kunt u de WebConfigurationManager klasse gebruiken, die dezelfde functionaliteit biedt, terwijl u ook toegang hebt tot instellingen die uniek zijn voor ASP.NET toepassingen, zoals die in <system.web>.

Opmerking

De System.Security.Cryptography naamruimte bevat klassen die aanvullende opties bieden voor het versleutelen en ontsleutelen van gegevens. Gebruik deze klassen als u cryptografische services nodig hebt die niet beschikbaar zijn met behulp van beveiligde configuratie. Sommige van deze klassen zijn wrappers voor de onbeheerde Microsoft CryptoAPI, terwijl andere uitsluitend beheerde implementaties zijn. Zie Cryptografische services voor meer informatie.

App.config voorbeeld

In dit voorbeeld ziet u hoe u de sectie connectionStrings kunt versleutelen in een app.config-bestand voor een Windows-toepassing. In dit voorbeeld gebruikt de procedure de naam van de toepassing als argument, bijvoorbeeld 'MyApplication.exe'. Het bestandapp.config wordt vervolgens versleuteld en gekopieerd naar de map die het uitvoerbare bestand bevat onder de naam 'MyApplication.exe.config'.

Opmerking

De verbindingsreeks kan alleen worden ontsleuteld op de computer waarop deze is versleuteld.

De code gebruikt de OpenExeConfiguration methode om het app.config-bestand te openen voor bewerking en de GetSection methode retourneert de sectie connectionStrings . De code controleert vervolgens de IsProtected-eigenschap en roept de ProtectSection aan om de sectie te versleutelen als deze nog niet versleuteld is. De UnprotectSection methode wordt aangeroepen om de sectie te ontsleutelen. De Save methode voltooit de bewerking en slaat de wijzigingen op.

Opmerking

U moet een verwijzing instellen naar System.Configuration.dll in uw project om de code uit te voeren.

static void ToggleConfigEncryption(string exeFile)
{
    // Takes the executable file name without the
    // .config extension.
    try
    {
        // Open the configuration file and retrieve
        // the connectionStrings section.
        Configuration config = ConfigurationManager.
            OpenExeConfiguration(exeConfigName);

        ConnectionStringsSection section =
            config.GetSection("connectionStrings")
            as ConnectionStringsSection;

        if (section.SectionInformation.IsProtected)
        {
            // Remove encryption.
            section.SectionInformation.UnprotectSection();
        }
        else
        {
            // Encrypt the section.
            section.SectionInformation.ProtectSection(
                "DataProtectionConfigurationProvider");
        }
        // Save the current configuration.
        config.Save();

        Console.WriteLine("Protected={0}",
            section.SectionInformation.IsProtected);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Web.config voorbeeld

In dit voorbeeld wordt de methode OpenWebConfiguration van de WebConfigurationManager gebruikt. In dit geval kunt u het relatieve pad naar het Web.config-bestand opgeven met behulp van een tilde. Voor de code is een verwijzing naar de System.Web.Configuration klasse vereist.

static void ToggleWebEncrypt()
{
    // Open the Web.config file.
    Configuration config = WebConfigurationManager.
        OpenWebConfiguration("~");

    // Get the connectionStrings section.
    ConnectionStringsSection section =
        config.GetSection("connectionStrings")
        as ConnectionStringsSection;

    // Toggle encryption.
    if (section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
    }
    else
    {
        section.SectionInformation.ProtectSection(
            "DataProtectionConfigurationProvider");
    }

    // Save changes to the Web.config file.
    config.Save();
}

Zie ASP.NET websites beveiligen voor meer informatie over het beveiligen van ASP.NET toepassingen.

Zie ook