Sdílet prostřednictvím


Připojovací řetězce a konfigurační soubory

Vkládání připojovací řetězec do kódu aplikace může vést k ohrožením zabezpečení a problémům s údržbou. Nešifrované připojovací řetězec zkompilované do zdrojového kódu aplikace lze zobrazit pomocí nástroje Ildasm.exe (IL Disassembler). Pokud se navíc připojovací řetězec někdy změní, musí se vaše aplikace znovu zkompilovat. Z těchto důvodů doporučujeme ukládat připojovací řetězec do konfiguračního souboru aplikace.

Důležité

Microsoft doporučuje používat nejbezpečnější dostupný tok ověřování. Pokud se připojujete k Azure SQL, spravované identity pro prostředky Azure se doporučují metodou ověřování.

Konfigurační soubory aplikace

Konfigurační soubory aplikace obsahují nastavení specifická pro konkrétní aplikaci. Například aplikace ASP.NET může mít jeden nebo více souborů web.config a aplikace pro Windows může mít volitelný soubor app.config . Konfigurační soubory sdílejí společné prvky, i když se název a umístění konfiguračního souboru liší v závislosti na hostiteli aplikace.

Oddíl connectionStrings

Připojovací řetězce lze uložit jako páry klíč/hodnota v části connectionStrings konfiguračního prvku konfiguračního souboru aplikace. Mezi podřízené prvky patří přidání, vymazání a odebrání.

Následující fragment konfiguračního souboru ukazuje schéma a syntaxi pro uložení připojovací řetězec. Atribut name je název, který zadáte k jedinečné identifikaci připojovací řetězec, aby se mohl načíst za běhu. ProviderName je invariantní název zprostředkovatele dat rozhraní .NET Framework, který je registrován v souboru 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>

Poznámka:

Část připojovací řetězec můžete uložit do konfiguračního souboru a pomocí DbConnectionStringBuilder třídy ji dokončit za běhu. To je užitečné ve scénářích, kdy neznáte prvky připojovací řetězec předem nebo když nechcete ukládat citlivé informace do konfiguračního souboru. Další informace naleznete v tématu Tvůrce připojovacích řetězců.

Použití externích konfiguračních souborů

Externí konfigurační soubory jsou samostatné soubory, které obsahují fragment konfiguračního souboru, který se skládá z jedné části. Na externí konfigurační soubor se pak odkazuje hlavní konfigurační soubor. Uložení oddílu connectionStrings do fyzicky samostatného souboru je užitečné v situacích, kdy připojovací řetězec mohou být po nasazení aplikace upraveny. Standardním chováním ASP.NET je například restartování domény aplikace při změně konfiguračních souborů, což vede ke ztrátě informací o stavu. Úprava externího konfiguračního souboru ale nezpůsobí restartování aplikace. Externí konfigurační soubory nejsou omezeny na ASP.NET; můžou je také používat aplikace systému Windows. Kromě toho lze zabezpečení a oprávnění přístupu k souborům použít k omezení přístupu k externím konfiguračním souborům. Práce s externími konfiguračními soubory za běhu je transparentní a nevyžaduje žádné speciální kódování.

Chcete-li uložit připojovací řetězec v externím konfiguračním souboru, vytvořte samostatný soubor, který obsahuje pouze část connectionStrings. Nezahrnujte žádné další prvky, oddíly ani atributy. Tento příklad ukazuje syntaxi externího konfiguračního souboru.

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

V hlavním konfiguračním souboru aplikace použijete atribut configSource k určení plně kvalifikovaného názvu a umístění externího souboru. Tento příklad odkazuje na externí konfigurační soubor s názvem connections.config.

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

Načtení připojovacích řetězců za běhu

Rozhraní .NET Framework 2.0 zavedlo nové třídy v System.Configuration oboru názvů, které zjednodušují načítání připojovací řetězec z konfiguračních souborů za běhu. Připojovací řetězec můžete načíst prostřednictvím kódu programu podle názvu nebo názvu poskytovatele.

Poznámka:

Soubor machine.config obsahuje také část connectionStrings, která obsahuje připojovací řetězec používané sadou Visual Studio. Při načítání připojovací řetězec podle názvu zprostředkovatele ze souboru app.config v aplikaci pro Windows se nejprve načtou připojovací řetězec v souboru machine.config a potom položky z app.config. Přidání clear okamžitě po elementu connectionStrings odebere všechny zděděné odkazy z datové struktury v paměti, takže se považují pouze připojovací řetězec definované v místním souboru app.config.

Práce s třídami konfigurace

Počínaje rozhraním .NET Framework 2.0 ConfigurationManager se používá při práci s konfiguračními soubory na místním počítači a nahrazuje zastaralou ConfigurationSettings třídu. WebConfigurationManager slouží k práci s konfiguračními soubory ASP.NET. Je navržený tak, aby fungoval s konfiguračními soubory na webovém serveru a umožňuje programový přístup k oddílům konfiguračních souborů, jako je system.web.

Poznámka:

Přístup ke konfiguračním souborům za běhu vyžaduje udělení oprávnění volajícímu; požadovaná oprávnění závisí na typu aplikace, konfiguračního souboru a umístění. Další informace najdete v tématu WebConfigurationManager o ASP.NET aplikacích a ConfigurationManager aplikacích pro Windows.

Můžete použít ConnectionStringSettingsCollection k načtení připojovací řetězec ze konfiguračních souborů aplikace. Obsahuje kolekci ConnectionStringSettings objektů, z nichž každá představuje jednu položku v části connectionStrings . Jeho vlastnosti se mapují na připojovací řetězec atributy, které umožňují načíst připojovací řetězec zadáním názvu nebo názvu zprostředkovatele.

Vlastnost Popis
Name Název připojovací řetězec. Mapuje se na atribut názvu .
ProviderName Plně kvalifikovaný název zprostředkovatele. Mapuje na atribut providerName .
ConnectionString Připojovací řetězec Mapuje se na atribut connectionString .

Příklad: Výpis všech připojovacích řetězců

Tento příklad prochází a ConnectionStringSettingsCollection zobrazuje ConnectionStringSettings.Name, ConnectionStringSettings.ProviderNamea ConnectionStringSettings.ConnectionString vlastnosti v okně konzoly.

Poznámka:

System.Configuration.dll není součástí všech typů projektů a možná budete muset nastavit odkaz na něj, aby bylo možné používat třídy konfigurace. Název a umístění konkrétního konfiguračního souboru aplikace se liší podle typu aplikace a procesu hostování.

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

Příklad: Načtení připojovacího řetězce podle názvu

Tento příklad ukazuje, jak načíst připojovací řetězec z konfiguračního souboru zadáním jeho názvu. Kód vytvoří ConnectionStringSettings objekt, který odpovídá zadanému vstupnímu parametru ConnectionStrings s názvem. Pokud se nenajde žádný odpovídající název, vrátí null funkce (Nothing v jazyce 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

Příklad: Načtení připojovacího řetězce podle názvu zprostředkovatele

Tento příklad ukazuje, jak načíst připojovací řetězec zadáním invariantní název zprostředkovatele ve formátu System.Data.ProviderName. Kód prochází ConnectionStringSettingsCollection a vrací připojovací řetězec pro první ProviderName nalezený kód. Pokud se název zprostředkovatele nenajde, vrátí null funkce (Nothing v jazyce 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

Šifrování oddílů konfiguračních souborů pomocí chráněné konfigurace

ASP.NET 2.0 zavedla novou funkci označovanou jako chráněná konfigurace, která umožňuje šifrovat citlivé informace v konfiguračním souboru. I když je primárně určená pro ASP.NET, chráněná konfigurace se dá použít také k šifrování oddílů konfiguračních souborů v aplikacích pro Windows.

Následující fragment konfiguračního souboru ukazuje část connectionStrings po zašifrování. ConfigProtectionProvider určuje chráněného zprostředkovatele konfigurace, který se používá k šifrování a dešifrování připojovací řetězec. Část EncryptedData obsahuje šifrovaný text.

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

Když se šifrovaný připojovací řetězec načte za běhu, rozhraní .NET Framework použije zadaného zprostředkovatele k dešifrování hodnoty cipherValue a jeho zpřístupnění pro vaši aplikaci. Ke správě procesu dešifrování nemusíte psát žádný další kód.

Zprostředkovatelé chráněných konfigurací

Zprostředkovatelé chráněné konfigurace jsou zaregistrovaní v části configProtectedData souboru machine.config v místním počítači, jak je znázorněno v následujícím fragmentu, který ukazuje dva chráněné zprostředkovatele konfigurace dodané s rozhraním .NET Framework. Zde uvedené hodnoty byly zkráceny kvůli čitelnosti.

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

Další chráněné zprostředkovatele konfigurace můžete nakonfigurovat tak, že je přidáte do souboru machine.config . Můžete také vytvořit vlastního chráněného ProtectedConfigurationProvider zprostředkovatele konfigurace tak, že dědíte z abstraktní základní třídy. Následující tabulka popisuje dva konfigurační soubory, které jsou součástí rozhraní .NET Framework.

Poskytovatel Popis
RsaProtectedConfigurationProvider Používá šifrovací algoritmus RSA k šifrování a dešifrování dat. Algoritmus RSA se dá použít pro šifrování veřejného klíče i digitální podpisy. Označuje se také jako "veřejný klíč" nebo asymetrické šifrování, protože využívá dva různé klíče. Pomocí nástroje ASP.NET IIS Registration Tool (Aspnet_regiis.exe) můžete zašifrovat oddíly v souboru Web.config a spravovat šifrovací klíče. ASP.NET při zpracování souboru dešifruje konfigurační soubor. Identita aplikace ASP.NET musí mít přístup pro čtení k šifrovacímu klíči, který se používá k šifrování a dešifrování šifrovaných oddílů.
DpapiProtectedConfigurationProvider K šifrování částí konfigurace používá rozhraní API pro ochranu dat windows (DPAPI). Používá integrované kryptografické služby systému Windows a dá se nakonfigurovat pro ochranu specifickou pro počítač nebo pro konkrétní uživatelský účet. Ochrana specifická pro počítač je užitečná pro více aplikací na stejném serveru, které potřebují sdílet informace. Ochranu specifickou pro uživatelský účet je možné použít se službami, které běží s konkrétní identitou uživatele, například se sdíleným hostitelským prostředím. Každá aplikace běží pod samostatnou identitou, která omezuje přístup k prostředkům, jako jsou soubory a databáze.

Oba poskytovatelé nabízejí silné šifrování dat. Pokud ale plánujete použít stejný šifrovaný konfigurační soubor na více serverech, jako je například webová farma, můžete šifrovací klíče použité k šifrování dat exportovat jenom RsaProtectedConfigurationProvider v případě, že je importujete na jiný server. Další informace najdete v tématu Import a export chráněných kontejnerů klíčů RSA konfigurace.

Použití tříd konfigurace

Obor System.Configuration názvů poskytuje třídy pro práci s nastavením konfigurace prostřednictvím kódu programu. Třída ConfigurationManager poskytuje přístup k konfiguračním souborům počítače, aplikace a uživatele. Pokud vytváříte ASP.NET aplikaci, můžete použít WebConfigurationManager třídu, která poskytuje stejné funkce a zároveň umožňuje přístup k nastavením, která jsou jedinečná pro ASP.NET aplikace, jako jsou například aplikace nalezené v <system.web>.

Poznámka:

System.Security.Cryptography Obor názvů obsahuje třídy, které poskytují další možnosti pro šifrování a dešifrování dat. Tyto třídy použijte, pokud požadujete kryptografické služby, které nejsou k dispozici pomocí chráněné konfigurace. Některé z těchto tříd jsou obálky pro nespravované rozhraní Microsoft CryptoAPI, zatímco jiné jsou čistě spravované implementace.

Příklad app.config

Tento příklad ukazuje, jak přepnout šifrování oddílu connectionStrings v souboru app.config pro aplikaci pro Windows. V tomto příkladu přebírá procedura název aplikace jako argument, například "MyApplication.exe". Soubor app.config se pak zašifruje a zkopíruje do složky, která obsahuje spustitelný soubor pod názvem "MyApplication.exe.config".

Kód používá metodu OpenExeConfiguration k otevření souboru app.config pro úpravy a GetSection metoda vrátí část connectionStrings . Kód pak zkontroluje IsProtected vlastnost, která zavolá ProtectSection zašifrování oddílu, pokud není zašifrovaná. Metoda UnprotectSection je vyvolána k dešifrování oddílu. (Připojovací řetězec lze dešifrovat pouze v počítači, na kterém byl zašifrován.) Metoda Save dokončí operaci a uloží změny.

Aby se kód spustil, musíte do System.Configuration.dll projektu přidat odkaz.

Důležité

Microsoft doporučuje používat nejbezpečnější dostupný tok ověřování. Pokud se připojujete k Azure SQL, spravované identity pro prostředky Azure se doporučují metodou ověřování.

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

Příklad web.config

Tento příklad používá OpenWebConfiguration metodu WebConfigurationManager. V tomto případě můžete zadat relativní cestu k souboru Web.config pomocí tildy. Kód vyžaduje odkaz na System.Web.Configuration třídu.

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

Další informace o zabezpečení aplikací ASP.NET naleznete v tématu Zabezpečení ASP.NET webů.

Viz také