Dela via


Anslut ionssträngar och konfigurationsfiler

Att bädda in anslutningssträng i programmets kod kan leda till säkerhetsproblem och underhållsproblem. Okrypterade anslutningssträng som kompilerats till ett programs källkod kan visas med verktyget Ildasm.exe (IL Disassembler). Om anslutningssträng ändras måste programmet dessutom omkompileras. Därför rekommenderar vi att du lagrar anslutningssträng i en programkonfigurationsfil.

Arbeta med programkonfigurationsfiler

Programkonfigurationsfiler innehåller inställningar som är specifika för ett visst program. Ett ASP.NET-program kan till exempel ha en eller flera web.config-filer , och ett Windows-program kan ha en valfri app.config-fil . Konfigurationsfiler delar gemensamma element, även om namnet och platsen för en konfigurationsfil varierar beroende på programmets värd.

Avsnittet connectionStrings

Anslut ionssträngar kan lagras som nyckel/värde-par i avsnittet connectionStrings i konfigurationselementet i en programkonfigurationsfil. Underordnade element inkluderar lägg till, rensa och ta bort.

Följande konfigurationsfilfragment visar schemat och syntaxen för lagring av en anslutningssträng. Namnattributet är ett namn som du anger för att unikt identifiera en anslutningssträng så att den kan hämtas vid körning. ProviderName är det invarianta namnet på .NET Framework-dataprovidern, som är registrerad i filen 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>  

Kommentar

Du kan spara en del av en anslutningssträng i en konfigurationsfil och använda DbConnectionStringBuilder klassen för att slutföra den vid körning. Detta är användbart i scenarier där du inte känner till element i anslutningssträng i förväg eller när du inte vill spara känslig information i en konfigurationsfil. Mer information finns i Anslut ion String Builders.

Använda externa konfigurationsfiler

Externa konfigurationsfiler är separata filer som innehåller ett fragment av en konfigurationsfil som består av ett enda avsnitt. Den externa konfigurationsfilen refereras sedan till av huvudkonfigurationsfilen. Att lagra avsnittet connectionStrings i en fysiskt separat fil är användbart i situationer där anslutningssträng kan redigeras när programmet har distribuerats. Standardbeteendet för ASP.NET är till exempel att starta om en programdomän när konfigurationsfiler ändras, vilket resulterar i att tillståndsinformation går förlorad. Att ändra en extern konfigurationsfil orsakar dock inte någon omstart av programmet. Externa konfigurationsfiler är inte begränsade till ASP.NET; De kan också användas av Windows-program. Dessutom kan filåtkomstsäkerhet och behörigheter användas för att begränsa åtkomsten till externa konfigurationsfiler. Att arbeta med externa konfigurationsfiler vid körning är transparent och kräver ingen särskild kodning.

Om du vill lagra anslutningssträng i en extern konfigurationsfil skapar du en separat fil som endast innehåller avsnittet connectionStrings. Ta inte med några ytterligare element, avsnitt eller attribut. Det här exemplet visar syntaxen för en extern konfigurationsfil.

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

I huvudprogrammets konfigurationsfil använder du attributet configSource för att ange det fullständigt kvalificerade namnet och platsen för den externa filen. Det här exemplet refererar till en extern konfigurationsfil med namnet connections.config.

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

Hämtar Anslut ionssträngar vid körning

.NET Framework 2.0 introducerade nya klasser i namnområdet för att förenkla hämtningen System.Configuration av anslutningssträng från konfigurationsfiler vid körning. Du kan programmatiskt hämta en anslutningssträng efter namn eller efter providernamn.

Kommentar

Filen machine.config innehåller också ett connectionStrings-avsnitt som innehåller anslutningssträng som används av Visual Studio. När du hämtar anslutningssträng efter providernamn från filen app.config i ett Windows-program läses anslutningssträng i machine.config in först och sedan posterna från app.config. Om du lägger till clear direkt efter connectionStrings-elementet tas alla ärvda referenser bort från datastrukturen i minnet, så att endast de anslutningssträng som definierats i den lokala filen app.config beaktas.

Arbeta med konfigurationsklasserna

Från och med .NET Framework 2.0 ConfigurationManager används när du arbetar med konfigurationsfiler på den lokala datorn och ersätter den inaktuella ConfigurationSettings. WebConfigurationManager används för att arbeta med ASP.NET konfigurationsfiler. Den är utformad för att fungera med konfigurationsfiler på en webbserver och ger programmatisk åtkomst till konfigurationsfilavsnitt som system.web.

Kommentar

Åtkomst till konfigurationsfiler vid körning kräver att du beviljar behörighet till anroparen. vilka behörigheter som krävs beror på typen av program, konfigurationsfil och plats. Mer information finns i Använda konfigurationsklasserna och WebConfigurationManager för ASP.NET program och ConfigurationManager för Windows-program.

Du kan använda ConnectionStringSettingsCollection för att hämta anslutningssträng från programkonfigurationsfiler. Den innehåller en samling ConnectionStringSettings objekt som var och en representerar en enda post i avsnittet connectionStrings . Dess egenskaper mappas till anslutningssträng attribut, så att du kan hämta en anslutningssträng genom att ange namnet eller providernamnet.

Property beskrivning
Name Namnet på anslutningssträng. Kartor till namnattributet.
ProviderName Det fullständigt kvalificerade providernamnet. Kartor till attributet providerName.
ConnectionString Anslutningssträng. Kartor till attributet connectionString.

Exempel: Lista alla Anslut ionssträngar

Det här exemplet itererar genom ConnectionStringSettingsCollection och visar ConnectionStringSettings.Nameegenskaperna , ConnectionStringSettings.ProviderNameoch ConnectionStringSettings.ConnectionString i konsolfönstret.

Kommentar

System.Configuration.dll ingår inte i alla projekttyper och du kan behöva ange en referens till den för att kunna använda konfigurationsklasserna. Namnet och platsen för en viss programkonfigurationsfil varierar beroende på programtyp och värdprocess.

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

Exempel: Hämta en Anslut ionssträng efter namn

Det här exemplet visar hur du hämtar en anslutningssträng från en konfigurationsfil genom att ange dess namn. Koden skapar ett ConnectionStringSettings objekt som matchar den angivna indataparametern med ConnectionStrings namnet. Om inget matchande namn hittas returnerar null funktionen (Nothing i 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

Exempel: Hämta en Anslut ionssträng efter providernamn

Det här exemplet visar hur du hämtar en anslutningssträng genom att ange namnet provider-invariant i formatet System.Data.ProviderName. Koden itererar genom ConnectionStringSettingsCollection och returnerar anslutningssträng för den första ProviderName hittades. Om providernamnet inte hittas returnerar null funktionen (Nothing i 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

Kryptera konfigurationsfilavsnitt med skyddad konfiguration

ASP.NET 2.0 introducerade en ny funktion, kallad skyddad konfiguration, som gör att du kan kryptera känslig information i en konfigurationsfil. Även om den främst är utformad för ASP.NET kan skyddad konfiguration också användas för att kryptera konfigurationsfilavsnitt i Windows-program. En detaljerad beskrivning av de skyddade konfigurationsfunktionerna finns i Kryptera konfigurationsinformation med hjälp av skyddad konfiguration.

Följande konfigurationsfilfragment visar avsnittet connectionStrings när det har krypterats. configProtectionProvider anger den skyddade konfigurationsprovider som används för att kryptera och dekryptera anslutningssträng. Avsnittet EncryptedData innehåller chiffertexten.

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

När den krypterade anslutningssträng hämtas vid körning använder .NET Framework den angivna providern för att dekryptera chiffervärdet och göra det tillgängligt för ditt program. Du behöver inte skriva någon ytterligare kod för att hantera dekrypteringsprocessen.

Skyddade konfigurationsprovidrar

Skyddade konfigurationsprovidrar är registrerade i avsnittet configProtectedData i filen machine.config på den lokala datorn, enligt följande fragment, som visar de två skyddade konfigurationsprovidrar som medföljer .NET Framework. Värdena som visas här har trunkerats för läsbarhet.

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

Du kan konfigurera ytterligare skyddade konfigurationsproviders genom att lägga till dem i filen machine.config . Du kan också skapa en egen skyddad konfigurationsprovider genom att ärva från den ProtectedConfigurationProvider abstrakta basklassen. I följande tabell beskrivs de två konfigurationsfilerna som ingår i .NET Framework.

Provider beskrivning
RsaProtectedConfigurationProvider Använder RSA-krypteringsalgoritmen för att kryptera och dekryptera data. RSA-algoritmen kan användas för både kryptering av offentliga nycklar och digitala signaturer. Det kallas även "offentlig nyckel" eller asymmetrisk kryptering eftersom den använder två olika nycklar. Du kan använda ASP.NET IIS-registreringsverktyget (Aspnet_regiis.exe) för att kryptera avsnitt i en Web.config-fil och hantera krypteringsnycklarna. ASP.NET dekrypterar konfigurationsfilen när den bearbetar filen. Identiteten för ASP.NET-programmet måste ha läsbehörighet till krypteringsnyckeln som används för att kryptera och dekryptera de krypterade avsnitten.
DpapiProtectedConfigurationProvider Använder Windows Data Protection API (DPAPI) för att kryptera konfigurationsavsnitt. Den använder de inbyggda kryptografiska tjänsterna i Windows och kan konfigureras för antingen maskinspecifikt eller användarkontospecifikt skydd. Datorspecifikt skydd är användbart för flera program på samma server som behöver dela information. Användarkontospecifikt skydd kan användas med tjänster som körs med en specifik användaridentitet, till exempel en delad värdmiljö. Varje program körs under en separat identitet som begränsar åtkomsten till resurser som filer och databaser.

Båda leverantörerna erbjuder stark datakryptering. Men om du planerar att använda samma krypterade konfigurationsfil på flera servrar, till exempel en webbgrupp, kan du bara exportera krypteringsnycklarna RsaProtectedConfigurationProvider som används för att kryptera data och importera dem på en annan server. Mer information finns i Importera och exportera RSA-nyckelcontainrar för skyddad konfiguration.

Använda konfigurationsklasserna

Namnområdet System.Configuration innehåller klasser som fungerar med konfigurationsinställningar programmatiskt. Klassen ConfigurationManager ger åtkomst till dator-, program- och användarkonfigurationsfiler. Om du skapar ett ASP.NET program kan du använda WebConfigurationManager klassen som ger samma funktioner samtidigt som du kan komma åt inställningar som är unika för ASP.NET program, till exempel de som finns i <system.web>.

Kommentar

Namnområdet System.Security.Cryptography innehåller klasser som ger ytterligare alternativ för kryptering och dekryptering av data. Använd dessa klasser om du behöver kryptografiska tjänster som inte är tillgängliga med hjälp av skyddad konfiguration. Vissa av dessa klasser är omslutningar för den ohanterade Microsoft CryptoAPI, medan andra är helt hanterade implementeringar. Mer information finns i Kryptografiska tjänster.

Exempel på App.config

Det här exemplet visar hur du växlar kryptering av avsnittet connectionStrings i en app.config-fil för ett Windows-program. I det här exemplet tar proceduren namnet på programmet som ett argument, till exempel "MyApplication.exe". Filen app.config krypteras och kopieras sedan till mappen som innehåller den körbara filen under namnet "MyApplication.exe.config".

Kommentar

Anslutningssträng kan bara dekrypteras på den dator där den krypterades.

Koden använder OpenExeConfiguration metoden för att öppna filen app.config för redigering, och GetSection metoden returnerar avsnittet connectionStrings . Koden kontrollerar IsProtected sedan egenskapen och anropar ProtectSection för att kryptera avsnittet om det inte är krypterat. Metoden UnprotectSection anropas för att dekryptera avsnittet. Metoden Save slutför åtgärden och sparar ändringarna.

Kommentar

Du måste ange en referens till System.Configuration.dll i projektet för att koden ska köras.

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-exempel

I det OpenWebConfiguration här exemplet används metoden för WebConfigurationManager. Observera att du i det här fallet kan ange den relativa sökvägen till filen Web.config med hjälp av en tilde. Koden kräver en referens till System.Web.Configuration klassen.

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

Mer information om hur du skyddar ASP.NET program finns i Skydda ASP.NET webbplatser.

Se även