Verbinding maken iontekenreeksen en configuratiebestanden

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

Verbinding maken iontekenreeksen 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 de invariante naam van de .NET Framework-gegevensprovider, die is geregistreerd in het bestand machine.config.

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

Notitie

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 Verbinding maken ion String Builders 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 verbindingsreeks s 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 verbindingsreeks wilt opslaan in een extern configuratiebestand, 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="System.Data.ProviderName"
   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>  

Verbinding maken iontekenreeksen ophalen tijdens runtime

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

Notitie

Het bestand machine.config bevat ook een connectionStrings-sectie, die verbindingsreeks s bevat die worden gebruikt door Visual Studio. Bij het ophalen van verbindingsreeks s op providernaam uit het bestand app.config in een Windows-toepassing, worden de verbindingsreeks s in machine.config eerst geladen en vervolgens de vermeldingen van app.config. Als u het element connectionStrings direct toevoegt, worden alle overgenomen verwijzingen uit de gegevensstructuur in het geheugen verwijderd, zodat alleen de verbindingsreeks s die zijn gedefinieerd in het lokale bestand app.config worden overwogen.

Werken met de configuratieklassen

Vanaf .NET Framework 2.0 wordt ConfigurationManager gebruikt bij het werken met configuratiebestanden op de lokale computer, waarbij de afgeschafte bestanden worden vervangen 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.

Notitie

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.

Eigenschappen Beschrijving
Name De naam van de verbindingsreeks. Kaarten naar het naamkenmerk.
ProviderName De volledig gekwalificeerde providernaam. Kaarten naar het kenmerk providerName.
ConnectionString De verbindingsreeks. Kaarten naar het kenmerk connectionString.

Voorbeeld: Alle Verbinding maken iontekenreeksen weergeven

In dit voorbeeld worden de ConnectionStringSettingsCollectionConnectionStringSettings.Name, ConnectionStringSettings.ProviderNameen ConnectionStringSettings.ConnectionString eigenschappen in het consolevenster herhaald en weergegeven.

Notitie

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

using System.Configuration;

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

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

        foreach (ConnectionStringSettings cs in settings)
        {
            Console.WriteLine(cs.Name);
            Console.WriteLine(cs.ProviderName);
            Console.WriteLine(cs.ConnectionString);
        }
    }
}
Imports System.Configuration

Class Program
    Shared Sub Main()
        GetConnectionStrings()
        Console.ReadLine()
    End Sub

    Private Shared Sub GetConnectionStrings()

        Dim settings As ConnectionStringSettingsCollection = _
            ConfigurationManager.ConnectionStrings

        If Not settings Is Nothing Then
            For Each cs As ConnectionStringSettings In settings
                Console.WriteLine(cs.Name)
                Console.WriteLine(cs.ProviderName)
                Console.WriteLine(cs.ConnectionString)
            Next
        End If
    End Sub
End Class

Voorbeeld: Een Verbinding maken iontekenreeks 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)
{
    // Look for the name in the connectionStrings section.
    ConnectionStringSettings? settings =
        ConfigurationManager.ConnectionStrings[name];

    // If found, return the connection string (otherwise return null)
    return settings?.ConnectionString;
}
' Retrieves a connection string by name.
' Returns Nothing if the name is not found.
Private Shared Function GetConnectionStringByName( _
    ByVal name As String) As String

    ' Assume failure
    Dim returnValue As String = Nothing

    ' Look for the name in the connectionStrings section.
    Dim settings As ConnectionStringSettings = _
       ConfigurationManager.ConnectionStrings(name)

    ' If found, return the connection string.
    If Not settings Is Nothing Then
        returnValue = settings.ConnectionString
    End If

    Return returnValue
End Function

Voorbeeld: een Verbinding maken iontekenreeks ophalen op providernaam

In dit voorbeeld ziet u hoe u een verbindingsreeks ophaalt door de naam van de provider-invariant op te geven in de indeling System.Data.ProviderName. De code doorloopt de ConnectionStringSettingsCollection code en retourneert de verbindingsreeks voor het eerst ProviderName gevonden. Als de providernaam niet wordt gevonden, retourneert null de functie (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)
{
    // 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)
            {
                return cs.ConnectionString;
            }
        }
    }
    return null;
}
' Retrieve a connection string by specifying the providerName.
' Assumes one connection string per provider in the config file.
Private Shared Function GetConnectionStringByProvider( _
    ByVal providerName As String) As String

    'Return Nothing on failure.
    Dim returnValue As String = Nothing

    ' Get the collection of connection strings.
    Dim settings As ConnectionStringSettingsCollection = _
        ConfigurationManager.ConnectionStrings

    ' Walk through the collection and return the first 
    ' connection string matching the providerName.
    If Not settings Is Nothing Then
        For Each cs As ConnectionStringSettings In settings
            If cs.ProviderName = providerName Then
                returnValue = cs.ConnectionString
                Exit For
            End If
        Next
    End If

    Return returnValue
End Function

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 verbindingsreeks s. 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 bestand machine.config 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 Beschrijving
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 die de toegang tot resources, zoals bestanden en databases, 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>.

Notitie

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.

Voorbeeld van App.config

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 bestand app.config wordt vervolgens versleuteld en gekopieerd naar de map met het uitvoerbare bestand onder de naam 'MyApplication.exe.config'.

Notitie

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

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

Notitie

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

static void ToggleConfigEncryption(string exeFile)
{
    // Get the application path needed to obtain
    // the application configuration file.

    // Takes the executable file name without the
    // .config extension.
    var exePath = exeFile.Replace(".config", "");

    try
    {
        // Open the configuration file and retrieve
        // the connectionStrings section.
        Configuration config = ConfigurationManager.
            OpenExeConfiguration(exePath);

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

        if (section != null)
        {
            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);
    }
}
Shared Sub ToggleConfigEncryption(ByVal exeConfigName As String)
    ' Takes the executable file name without the
    ' .config extension.
    Try
        ' Open the configuration file and retrieve 
        ' the connectionStrings section.
        Dim config As Configuration = ConfigurationManager. _
            OpenExeConfiguration(exeConfigName)

        Dim section As ConnectionStringsSection = DirectCast( _
            config.GetSection("connectionStrings"), _
            ConnectionStringsSection)

        If section.SectionInformation.IsProtected Then
            ' Remove encryption.
            section.SectionInformation.UnprotectSection()
        Else
            ' Encrypt the section.
            section.SectionInformation.ProtectSection( _
              "DataProtectionConfigurationProvider")
        End If

        ' Save the current configuration.
        config.Save()

        Console.WriteLine("Protected={0}", _
        section.SectionInformation.IsProtected)

    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try
End Sub

Web.config-voorbeeld

In dit voorbeeld wordt de OpenWebConfiguration methode van de WebConfigurationManager. 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.
    var 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();
}
Shared Sub ToggleWebEncrypt()
    ' Open the Web.config file.
    Dim config As Configuration = WebConfigurationManager. _
      OpenWebConfiguration("~")

    ' Get the connectionStrings section.
    Dim section As ConnectionStringsSection = DirectCast( _
        config.GetSection("connectionStrings"), _
        ConnectionStringsSection)

    ' Toggle encryption.
    If section.SectionInformation.IsProtected Then
        section.SectionInformation.UnprotectSection()
    Else
        section.SectionInformation.ProtectSection( _
          "DataProtectionConfigurationProvider")
    End If

    ' Save changes to the Web.config file.
    config.Save()
End Sub

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

Zie ook