Parametry połączenia i pliki konfiguracji

Osadzanie parametry połączenia w kodzie aplikacji może prowadzić do problemów z lukami w zabezpieczeniach i konserwacją. Niezaszyfrowane parametry połączenia skompilowane w kodzie źródłowym aplikacji można wyświetlić przy użyciu narzędzia Ildasm.exe (IL Dezasembler). Ponadto jeśli parametry połączenia kiedykolwiek się zmieni, aplikacja musi zostać ponownie skompilowana. Z tych powodów zalecamy przechowywanie parametry połączenia w pliku konfiguracji aplikacji.

Praca z plikami konfiguracji aplikacji

Pliki konfiguracji aplikacji zawierają ustawienia specyficzne dla określonej aplikacji. Na przykład aplikacja ASP.NET może mieć co najmniej jeden plik web.config , a aplikacja systemu Windows może mieć opcjonalny plik app.config . Pliki konfiguracji mają wspólne elementy, chociaż nazwa i lokalizacja pliku konfiguracji różnią się w zależności od hosta aplikacji.

Sekcja connectionStrings

parametry Połączenie ion mogą być przechowywane jako pary klucz/wartość w sekcji connectionStrings elementu konfiguracji pliku konfiguracji aplikacji. Elementy podrzędne obejmują dodawanie, czyszczenie i usuwanie.

Poniższy fragment pliku konfiguracji przedstawia schemat i składnię do przechowywania parametry połączenia. Atrybut name jest nazwą podaną w celu unikatowego zidentyfikowania parametry połączenia, aby można było go pobrać w czasie wykonywania. ProviderName jest niezmienną nazwą dostawcy danych programu .NET Framework, który jest zarejestrowany w pliku 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>  

Uwaga

Część parametry połączenia można zapisać w pliku konfiguracji i użyć DbConnectionStringBuilder klasy , aby ukończyć ją w czasie wykonywania. Jest to przydatne w scenariuszach, w których nie znasz elementów parametry połączenia z wyprzedzeniem lub gdy nie chcesz zapisywać poufnych informacji w pliku konfiguracji. Aby uzyskać więcej informacji, zobacz Połączenie ion String Builders.

Korzystanie z plików konfiguracji zewnętrznej

Pliki konfiguracji zewnętrznej są oddzielnymi plikami, które zawierają fragment pliku konfiguracji składającego się z jednej sekcji. Plik konfiguracji zewnętrznej jest następnie przywołyyny przez główny plik konfiguracji. Przechowywanie sekcji connectionStrings w fizycznie oddzielnym pliku jest przydatne w sytuacjach, w których parametry połączenia mogą być edytowane po wdrożeniu aplikacji. Na przykład standardowe zachowanie ASP.NET polega na ponownym uruchomieniu domeny aplikacji po zmodyfikowaniu plików konfiguracji, co powoduje utratę informacji o stanie. Jednak modyfikowanie pliku konfiguracji zewnętrznej nie powoduje ponownego uruchomienia aplikacji. Pliki konfiguracji zewnętrznej nie są ograniczone do ASP.NET; mogą być one również używane przez aplikacje systemu Windows. Ponadto można użyć zabezpieczeń dostępu do plików i uprawnień w celu ograniczenia dostępu do zewnętrznych plików konfiguracji. Praca z zewnętrznymi plikami konfiguracji w czasie wykonywania jest niewidoczna i nie wymaga specjalnego kodowania.

Aby przechowywać parametry połączenia w zewnętrznym pliku konfiguracji, utwórz oddzielny plik zawierający tylko sekcję connectionStrings. Nie dołączaj żadnych dodatkowych elementów, sekcji ani atrybutów. W tym przykładzie przedstawiono składnię pliku konfiguracji zewnętrznej.

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

W głównym pliku konfiguracji aplikacji należy użyć atrybutu configSource , aby określić w pełni kwalifikowaną nazwę i lokalizację pliku zewnętrznego. W tym przykładzie odwołuje się do zewnętrznego pliku konfiguracji o nazwie connections.config.

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

Pobieranie ciągów Połączenie ion w czasie wykonywania

Program .NET Framework 2.0 wprowadził nowe klasy w System.Configuration przestrzeni nazw, aby uprościć pobieranie parametry połączenia z plików konfiguracji w czasie wykonywania. Można programowo pobrać parametry połączenia według nazwy lub nazwy dostawcy.

Uwaga

Plik machine.config zawiera również sekcję connectionStrings, która zawiera parametry połączenia używane przez program Visual Studio. Podczas pobierania parametry połączenia według nazwy dostawcy z pliku app.config w aplikacji systemu Windows parametry połączenia s w pliku machine.config są najpierw ładowane, a następnie wpisy z pliku app.config. Dodanie wyczyść bezpośrednio po elemencie connectionStrings usuwa wszystkie dziedziczone odwołania ze struktury danych w pamięci, dzięki czemu uwzględniane są tylko parametry połączenia zdefiniowane w lokalnym pliku app.config.

Praca z klasami konfiguracji

Począwszy od programu .NET Framework 2.0, ConfigurationManager jest używany podczas pracy z plikami konfiguracji na komputerze lokalnym, zastępując przestarzałe ConfigurationSettings. WebConfigurationManager służy do pracy z plikami konfiguracji ASP.NET. Jest przeznaczony do pracy z plikami konfiguracji na serwerze sieci Web i umożliwia programowy dostęp do sekcji plików konfiguracji, takich jak system.web.

Uwaga

Uzyskiwanie dostępu do plików konfiguracji w czasie wykonywania wymaga udzielenia uprawnień do wywołującego; wymagane uprawnienia zależą od typu aplikacji, pliku konfiguracji i lokalizacji. Aby uzyskać więcej informacji, zobacz Using the Configuration Classes and for ASP.NET applications, and for Windows applications (Używanie klas konfiguracji i WebConfigurationManager aplikacji ASP.NET dla ConfigurationManager aplikacji systemu Windows).

Możesz użyć polecenia ConnectionStringSettingsCollection , aby pobrać parametry połączenia z plików konfiguracji aplikacji. Zawiera kolekcję ConnectionStringSettings obiektów, z których każda reprezentuje pojedynczy wpis w sekcji connectionStrings . Jego właściwości są mapowane na parametry połączenia atrybuty, co umożliwia pobranie parametry połączenia przez określenie nazwy lub nazwy dostawcy.

Właściwości opis
Name Nazwa parametry połączenia. Mapy do atrybutu name.
ProviderName W pełni kwalifikowana nazwa dostawcy. Mapy atrybut providerName.
ConnectionString Parametry połączenia. Mapy atrybut connectionString.

Przykład: wyświetlanie listy wszystkich ciągów Połączenie ion

W tym przykładzie ConnectionStringSettingsCollection iteruje element i wyświetla ConnectionStringSettings.Namewłaściwości , ConnectionStringSettings.ProviderNamei ConnectionStringSettings.ConnectionString w oknie konsoli.

Uwaga

System.Configuration.dll nie jest uwzględniana we wszystkich typach projektów i może być konieczne ustawienie odwołania do niego w celu używania klas konfiguracji. Nazwa i lokalizacja określonego pliku konfiguracji aplikacji różnią się w zależności od typu aplikacji i procesu hostingu.

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

Przykład: pobieranie ciągu Połączenie ion według nazwy

W tym przykładzie pokazano, jak pobrać parametry połączenia z pliku konfiguracji, określając jego nazwę. Kod tworzy ConnectionStringSettings obiekt, pasujący do podanego parametru wejściowego ConnectionStrings do nazwy. Jeśli nie zostanie znaleziona zgodna nazwa, funkcja zwróci null wartość (Nothing w 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

Przykład: pobieranie ciągu Połączenie ion według nazwy dostawcy

W tym przykładzie pokazano, jak pobrać parametry połączenia, określając niezmienną nazwę dostawcy w formacie System.Data.ProviderName. Kod iteruje przez ConnectionStringSettingsCollection element i zwraca parametry połączenia dla pierwszego ProviderName znalezionego elementu. Jeśli nazwa dostawcy nie zostanie znaleziona, funkcja zwróci null wartość (Nothing w 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

Szyfrowanie sekcji plików konfiguracji przy użyciu konfiguracji chronionej

ASP.NET 2.0 wprowadzono nową funkcję nazywaną konfiguracją chronioną, która umożliwia szyfrowanie poufnych informacji w pliku konfiguracji. Mimo że jest przeznaczona głównie do ASP.NET, chroniona konfiguracja może być również używana do szyfrowania sekcji plików konfiguracji w aplikacjach systemu Windows. Aby uzyskać szczegółowy opis funkcji konfiguracji chronionej, zobacz Szyfrowanie informacji o konfiguracji przy użyciu chronionej konfiguracji.

Poniższy fragment pliku konfiguracji przedstawia sekcję connectionStrings po zaszyfrowaniu. Element configProtectionProvider określa chronionego dostawcę konfiguracji używanego do szyfrowania i odszyfrowania parametry połączenia. Sekcja EncryptedData zawiera tekst szyfrowania.

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

Po pobraniu zaszyfrowanego parametry połączenia w czasie wykonywania program .NET Framework używa określonego dostawcy do odszyfrowywania wartości szyfrowania i udostępniania jej aplikacji. Nie trzeba pisać żadnego dodatkowego kodu w celu zarządzania procesem odszyfrowywania.

Chronieni dostawcy konfiguracji

Chronieni dostawcy konfiguracji są zarejestrowani w sekcji configProtectedData pliku machine.config na komputerze lokalnym, jak pokazano w poniższym fragmencie, który pokazuje dwóch chronionych dostawców konfiguracji dostarczonych z programem .NET Framework. Pokazane tutaj wartości zostały obcięte pod kątem czytelności.

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

Można skonfigurować dodatkowych chronionych dostawców konfiguracji, dodając ich do pliku machine.config . Możesz również utworzyć własnego chronionego dostawcę konfiguracji, dziedzicząc z abstrakcyjnej klasy bazowej ProtectedConfigurationProvider . W poniższej tabeli opisano dwa pliki konfiguracji dołączone do programu .NET Framework.

Dostawca opis
RsaProtectedConfigurationProvider Używa algorytmu szyfrowania RSA do szyfrowania i odszyfrowywania danych. Algorytm RSA może służyć zarówno do szyfrowania klucza publicznego, jak i podpisów cyfrowych. Jest on również nazywany "kluczem publicznym" lub szyfrowaniem asymetrycznym, ponieważ stosuje dwa różne klucze. Aby zaszyfrować sekcje w pliku Web.config i zarządzać kluczami szyfrowania, można użyć narzędzia ASP.NET rejestracji usług IIS (Aspnet_regiis.exe ). ASP.NET odszyfrowuje plik konfiguracji podczas przetwarzania pliku. Tożsamość aplikacji ASP.NET musi mieć dostęp do odczytu do klucza szyfrowania używanego do szyfrowania i odszyfrowywania zaszyfrowanych sekcji.
DpapiProtectedConfigurationProvider Używa interfejsu API ochrony danych systemu Windows (DPAPI) do szyfrowania sekcji konfiguracji. Korzysta z wbudowanych usług kryptograficznych systemu Windows i można je skonfigurować pod kątem ochrony specyficznej dla maszyny lub konta użytkownika. Ochrona specyficzna dla maszyny jest przydatna w przypadku wielu aplikacji na tym samym serwerze, które muszą udostępniać informacje. Ochrona specyficzna dla konta użytkownika może być używana z usługami, które są uruchamiane z określoną tożsamością użytkownika, taką jak udostępnione środowisko hostingu. Każda aplikacja działa w ramach oddzielnej tożsamości, która ogranicza dostęp do zasobów, takich jak pliki i bazy danych.

Oba dostawcy oferują silne szyfrowanie danych. Jeśli jednak planujesz użyć tego samego zaszyfrowanego pliku konfiguracji na wielu serwerach, takich jak farma sieci Web, tylko RsaProtectedConfigurationProvider program umożliwia eksportowanie kluczy szyfrowania używanych do szyfrowania danych i importowanie ich na innym serwerze. Aby uzyskać więcej informacji, zobacz Importowanie i eksportowanie kontenerów kluczy RSA konfiguracji chronionej.

Używanie klas konfiguracji

System.Configuration Przestrzeń nazw zapewnia klasy do pracy z ustawieniami konfiguracji programowo. Klasa ConfigurationManager zapewnia dostęp do plików konfiguracji komputera, aplikacji i użytkownika. Jeśli tworzysz aplikację ASP.NET, możesz użyć WebConfigurationManager klasy , która zapewnia te same funkcje, a także umożliwia dostęp do ustawień unikatowych dla ASP.NET aplikacji, takich jak te znajdujące się w <pliku system.web>.

Uwaga

System.Security.Cryptography Przestrzeń nazw zawiera klasy, które zapewniają dodatkowe opcje szyfrowania i odszyfrowywania danych. Użyj tych klas, jeśli potrzebujesz usług kryptograficznych, które nie są dostępne przy użyciu konfiguracji chronionej. Niektóre z tych klas są otokami niezarządzanych interfejsów Microsoft CryptoAPI, podczas gdy inne są wyłącznie implementacjami zarządzanymi. Aby uzyskać więcej informacji, zobacz Usługi kryptograficzne.

Przykład app.config

W tym przykładzie pokazano, jak przełączać szyfrowanie sekcji connectionStrings w pliku app.config dla aplikacji systemu Windows. W tym przykładzie procedura przyjmuje nazwę aplikacji jako argument, na przykład "MyApplication.exe". Następnie plik app.config zostanie zaszyfrowany i skopiowany do folderu zawierającego plik wykonywalny pod nazwą "MyApplication.exe.config".

Uwaga

Parametry połączenia można odszyfrować tylko na komputerze, na którym został zaszyfrowany.

Kod używa OpenExeConfiguration metody , aby otworzyć plik app.config do edycji, a GetSection metoda zwraca sekcję connectionStrings . Następnie kod sprawdza IsProtected właściwość , wywołując ProtectSection metodę w celu zaszyfrowania sekcji, jeśli nie jest zaszyfrowana. Metoda UnprotectSection jest wywoływana w celu odszyfrowania sekcji. Metoda Save kończy operację i zapisuje zmiany.

Uwaga

Należy ustawić odwołanie do elementu w projekcie, aby System.Configuration.dll kod był uruchamiany.

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

Przykład web.config

W tym przykładzie WebConfigurationManagerużyto OpenWebConfiguration metody . Należy pamiętać, że w tym przypadku można podać ścieżkę względną do pliku Web.config przy użyciu tyldy. Kod wymaga odwołania do System.Web.Configuration klasy.

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

Aby uzyskać więcej informacji na temat zabezpieczania aplikacji ASP.NET, zobacz Zabezpieczanie witryn internetowych ASP.NET.

Zobacz też