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.
Ważne
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Jeśli łączysz się z usługą Azure SQL, tożsamości zarządzane dla zasobów platformy Azure to zalecana metoda uwierzytelniania.
Pliki 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łączenia 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 przed upływem czasu lub gdy nie chcesz zapisywać poufnych informacji w pliku konfiguracji. Aby uzyskać więcej informacji, zobacz Konstruktory parametrów połączenia.
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 parametrów połączenia 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łą ConfigurationSettings klasę. 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 WebConfigurationManager ASP.NET aplikacji i 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. Mapuje na atrybut name . |
ProviderName | W pełni kwalifikowana nazwa dostawcy. Mapuje atrybut providerName . |
ConnectionString | Parametry połączenia. Mapuje na atrybut connectionString . |
Przykład: wyświetlanie listy wszystkich parametrów połączenia
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życia 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 parametrów połączenia 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 parametrów połączenia 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
Szyfruj sekcje 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.
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 dostarczanych 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.
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". Plik app.config jest następnie szyfrowany i kopiowany do folderu zawierającego plik wykonywalny pod nazwą "MyApplication.exe.config".
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. (Parametry połączenia można odszyfrować tylko na komputerze, na którym został zaszyfrowany). Metoda Save kończy operację i zapisuje zmiany.
Aby można było uruchomić kod, musisz dodać odwołanie do System.Configuration.dll
elementu w projekcie.
Ważne
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Jeśli łączysz się z usługą Azure SQL, tożsamości zarządzane dla zasobów platformy Azure to zalecana metoda uwierzytelniania.
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 WebConfigurationManager
użyto OpenWebConfiguration metody . W takim 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.