Csatlakozás ion sztringek és konfigurációs fájlok

A kapcsolati sztring beágyazása az alkalmazás kódjába biztonsági résekhez és karbantartási problémákhoz vezethet. Az alkalmazás forráskódjába lefordított titkosítatlan kapcsolati sztring az Ildasm.exe (IL Disassembler) eszközzel tekinthetők meg. Továbbá, ha a kapcsolati sztring valaha is megváltozik, az alkalmazást újra kell lefordítani. Ezért javasoljuk, hogy kapcsolati sztring tároljunk egy alkalmazáskonfigurációs fájlban.

Alkalmazáskonfigurációs fájlok használata

Az alkalmazáskonfigurációs fájlok egy adott alkalmazásra vonatkozó beállításokat tartalmaznak. Egy ASP.NET alkalmazás például egy vagy több web.config fájllal rendelkezhet, a Windows-alkalmazások pedig opcionális app.config fájllal. A konfigurációs fájlok közös elemeket tartalmaznak, bár a konfigurációs fájlok neve és helye az alkalmazás gazdagépétől függően eltérő.

A connectionStrings szakasz

Csatlakozás ion sztringek kulcs/érték párként tárolhatók az alkalmazáskonfigurációs fájl konfigurációs elemének ConnectionStrings szakaszában. A gyermekelemek közé tartozik a hozzáadás, a törlés és az eltávolítás.

Az alábbi konfigurációs fájlrészlet egy kapcsolati sztring tárolására szolgáló sémát és szintaxist mutatja be. A névattribútum egy olyan név, amellyel egyedileg azonosíthat egy kapcsolati sztring, hogy futásidőben lekérhető legyen. A providerName a .NET-keretrendszer adatszolgáltató invariáns neve, amely a machine.config fájlban van regisztrálva.

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

Feljegyzés

A kapcsolati sztring egy részét mentheti egy konfigurációs fájlba, és az DbConnectionStringBuilder osztály használatával futtatáskor végezheti el. Ez olyan helyzetekben hasznos, amikor nem ismeri előre a kapcsolati sztring elemeit, vagy ha nem szeretne bizalmas adatokat menteni egy konfigurációs fájlba. További információ: Csatlakozás ion String Builders.

Külső konfigurációs fájlok használata

A külső konfigurációs fájlok különálló fájlok, amelyek egyetlen szakaszból álló konfigurációs fájl töredékét tartalmazzák. A külső konfigurációs fájlra ezután a fő konfigurációs fájl hivatkozik. A connectionStrings szakasz fizikailag különálló fájlban való tárolása olyan esetekben hasznos, amikor kapcsolati sztring lehet szerkeszteni az alkalmazás üzembe helyezése után. A szokásos ASP.NET viselkedés például egy alkalmazástartomány újraindítása konfigurációs fájlok módosításakor, ami az állapotinformációk elvesztését eredményezi. A külső konfigurációs fájl módosítása azonban nem okoz alkalmazás-újraindítást. A külső konfigurációs fájlok nem korlátozódnak ASP.NET; Windows-alkalmazások is használhatják őket. Emellett a fájlhozzáférés biztonsága és az engedélyek a külső konfigurációs fájlokhoz való hozzáférés korlátozására is használhatók. A külső konfigurációs fájlok futtatásakor végzett munka transzparens, és nem igényel speciális kódolást.

Ha egy külső konfigurációs fájlban szeretné tárolni a kapcsolati sztring, hozzon létre egy külön fájlt, amely csak a connectionStrings szakaszt tartalmazza. Ne tartalmazzon további elemeket, szakaszokat vagy attribútumokat. Ez a példa egy külső konfigurációs fájl szintaxisát mutatja be.

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

A fő alkalmazáskonfigurációs fájlban a configSource attribútum használatával adja meg a külső fájl teljes nevét és helyét. Ez a példa egy külső konfigurációs fájlra hivatkozik connections.config.

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

Csatlakozás ion-sztringek lekérése futásidőben

A .NET-keretrendszer 2.0 új osztályokat vezetett be a névtérben, System.Configuration hogy leegyszerűsítse a kapcsolati sztring lekérését a konfigurációs fájlokból futásidőben. A kapcsolati sztring programozott módon lekérheti név vagy szolgáltatónév alapján.

Feljegyzés

A machine.config fájl tartalmaz egy connectionStrings szakaszt is, amely a Visual Studio által használt kapcsolati sztring tartalmaz. Amikor a kapcsolati sztring szolgáltatónév alapján lekér egy Windows-alkalmazásban lévő app.config fájlból, először a machine.config kapcsolati sztring, majd az app.config bejegyzései lesznek betöltve. A connectionStrings elem közvetlen hozzáadása eltávolítja az összes örökölt hivatkozást a memóriában lévő adatstruktúrából, így csak a helyi app.config fájlban definiált kapcsolati sztring tekinthetők meg.

A konfigurációs osztályok használata

A .NET-keretrendszer 2.0-val ConfigurationManager kezdődően a rendszer a helyi számítógépen lévő konfigurációs fájlokkal való munka során használja az elavult ConfigurationSettingsfájlokat. WebConfigurationManager ASP.NET konfigurációs fájlok kezelésére szolgál. Úgy tervezték, hogy konfigurációs fájlokkal működjön egy webkiszolgálón, és programozott hozzáférést biztosít a konfigurációs fájlszakaszokhoz, például a system.web-hez.

Feljegyzés

A konfigurációs fájlok futásidőben való eléréséhez engedélyeket kell adni a hívónak; a szükséges engedélyek az alkalmazás típusától, a konfigurációs fájltól és a helytől függnek. További információ: A konfigurációs osztályok használata, WebConfigurationManager ASP.NET alkalmazások és ConfigurationManager Windows-alkalmazások.

A kapcsolati sztring ConnectionStringSettingsCollection alkalmazáskonfigurációs fájlokból is lekérheti. Objektumgyűjteményt ConnectionStringSettings tartalmaz, amelyek mindegyike egyetlen bejegyzést jelöl a connectionStrings szakaszban. A tulajdonságok kapcsolati sztring attribútumokra vannak leképezve, így a név vagy a szolgáltató nevének megadásával lekérheti a kapcsolati sztring.

Tulajdonság Leírás
Name A kapcsolati sztring neve. Térképek a névattribútumra.
ProviderName A teljes szolgáltató neve. Térképek a providerName attribútumra.
ConnectionString A kapcsolati sztring. Térképek a connectionString attribútumhoz.

Példa: Az összes Csatlakozás ion-sztring felsorolása

Ez a példa végigvezeti a ConnectionStringSettingsCollection konzolablakon, és megjeleníti a ConnectionStringSettings.Name, ConnectionStringSettings.ProviderNameés ConnectionStringSettings.ConnectionString tulajdonságokat.

Feljegyzés

System.Configuration.dll nem szerepel minden projekttípusban, és előfordulhat, hogy a konfigurációs osztályok használatához be kell állítania a hivatkozását. Egy adott alkalmazáskonfigurációs fájl neve és helye az alkalmazás típusától és az üzemeltetési folyamattól függően változik.

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élda: Csatlakozás ion-sztring beolvasása név szerint

Ez a példa bemutatja, hogyan kérhető le egy kapcsolati sztring egy konfigurációs fájlból a nevének megadásával. A kód létrehoz egy ConnectionStringSettings objektumot, amely megfelel a megadott bemeneti paraméternek a ConnectionStrings névvel. Ha nem található egyező név, a függvény visszaadja null (Nothing a Visual Basicben).

// 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élda: Csatlakozás ion-sztring beolvasása szolgáltatónév alapján

Ez a példa bemutatja, hogyan kérhető le egy kapcsolati sztring a provider-invariant név System.Data.ProviderName formátumban való megadásával. A kód végigvezeti a rendszeren, ConnectionStringSettingsCollection és visszaadja az első ProviderName talált kapcsolati sztring. Ha a szolgáltató neve nem található, a függvény visszaadja null (Nothing a Visual Basicben).

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

Konfigurációs fájlszakaszok titkosítása védett konfigurációval

ASP.NET 2.0 bevezetett egy új, védett konfiguráció nevű funkciót, amely lehetővé teszi a bizalmas adatok titkosítását egy konfigurációs fájlban. Bár elsősorban ASP.NET, a védett konfiguráció a Windows-alkalmazások konfigurációs fájlszakaszainak titkosítására is használható. A védett konfigurációs képességek részletes leírását lásd : Konfigurációs információk titkosítása védett konfiguráció használatával.

Az alábbi konfigurációs fájlrészlet a connectionStrings szakaszt jeleníti meg a titkosítás után. A configProtectionProvider megadja a kapcsolati sztring titkosításához és visszafejtéséhez használt védett konfigurációs szolgáltatót. A EncryptedData szakasz tartalmazza a titkosítási szöveget.

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

Amikor a titkosított kapcsolati sztring futásidőben kéri le, a .NET-keretrendszer a megadott szolgáltatóval fejti vissza a CipherValue-t, és elérhetővé teszi az alkalmazás számára. A visszafejtési folyamat kezeléséhez nem kell további kódot írnia.

Védett konfigurációszolgáltatók

A védett konfigurációszolgáltatók a machine.config fájl configProtectedData szakaszában vannak regisztrálva a helyi számítógépen, ahogyan az a következő töredékben látható, amely a .NET-keretrendszer biztosított két védett konfigurációs szolgáltatót mutatja. Az itt látható értékek csonkolva lettek az olvashatóság érdekében.

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

További védett konfigurációs szolgáltatókat úgy konfigurálhat, hogy hozzáadja őket a machine.config fájlhoz . Saját védett konfigurációs szolgáltatót is létrehozhat az absztrakt alaposztálytól ProtectedConfigurationProvider való örökléssel. Az alábbi táblázat a .NET-keretrendszer tartalmazott két konfigurációs fájlt ismerteti.

Szolgáltató Leírás
RsaProtectedConfigurationProvider Az RSA titkosítási algoritmussal titkosítja és visszafejti az adatokat. Az RSA-algoritmus nyilvános kulcsok titkosításához és digitális aláírásokhoz is használható. Ezt "nyilvános kulcsnak" vagy aszimmetrikus titkosításnak is nevezik, mert két különböző kulcsot használ. Az ASP.NET IIS regisztrációs eszköz (Aspnet_regiis.exe) segítségével titkosíthatja a Web.config fájl szakaszait, és kezelheti a titkosítási kulcsokat. ASP.NET visszafejti a konfigurációs fájlt a fájl feldolgozásakor. A ASP.NET alkalmazás identitásának olvasási hozzáféréssel kell rendelkeznie a titkosított szakaszok titkosításához és visszafejtéséhez használt titkosítási kulcshoz.
DpapiProtectedConfigurationProvider A Windows Data Protection API (DPAPI) használatával titkosítja a konfigurációs szakaszokat. A windowsos beépített titkosítási szolgáltatásokat használja, és gépspecifikus vagy felhasználói fiókspecifikus védelemre konfigurálható. A gépspecifikus védelem akkor hasznos, ha ugyanazon a kiszolgálón több olyan alkalmazást is használ, amelyeknek meg kell osztaniuk az információkat. A felhasználófiók-specifikus védelem olyan szolgáltatásokkal használható, amelyek egy adott felhasználói identitással, például megosztott üzemeltetési környezettel futnak. Minden alkalmazás egy külön identitás alatt fut, amely korlátozza az erőforrásokhoz, például fájlokhoz és adatbázisokhoz való hozzáférést.

Mindkét szolgáltató erős adattitkosítást biztosít. Ha azonban ugyanazt a titkosított konfigurációs fájlt több kiszolgálón( például egy webfarmon) tervezi használni, csak az RsaProtectedConfigurationProvider teszi lehetővé, hogy exportálja az adatok titkosításához használt titkosítási kulcsokat, és importálja őket egy másik kiszolgálón. További információ: Védett konfigurációs RSA-kulcstárolók importálása és exportálása.

A konfigurációs osztályok használata

A System.Configuration névtérben az osztályok programozott módon kezelhetik a konfigurációs beállításokat. Az ConfigurationManager osztály hozzáférést biztosít a gépi, alkalmazás- és felhasználói konfigurációs fájlokhoz. Ha ASP.NET alkalmazást hoz létre, használhatja az WebConfigurationManager osztályt, amely ugyanazokat a funkciókat biztosítja, ugyanakkor lehetővé teszi a ASP.NET alkalmazásokra jellemző, például a system.web-ben>< található beállítások elérését.

Feljegyzés

A System.Security.Cryptography névtér olyan osztályokat tartalmaz, amelyek további lehetőségeket biztosítanak az adatok titkosítására és visszafejtésére. Ezeket az osztályokat akkor használja, ha olyan titkosítási szolgáltatásokat igényel, amelyek nem érhetők el védett konfigurációval. Ezen osztályok némelyike burkoló a nem felügyelt Microsoft CryptoAPI-hoz, míg mások tisztán felügyelt implementációk. További információ: Cryptographic Services.

Példa az App.config használatára

Ez a példa bemutatja, hogyan kapcsolhatja be a ConnectionStrings szakasz titkosítását egy Windows-alkalmazás app.config fájljában. Ebben a példában az eljárás argumentumként veszi fel az alkalmazás nevét, például "MyApplication.exe". Az app.config fájl ezután titkosítva lesz, és a "MyApplication.exe.config" néven a végrehajtható fájlt tartalmazó mappába lesz másolva.

Feljegyzés

A kapcsolati sztring csak azon a számítógépen fejthető vissza, amelyen titkosították.

A kód a OpenExeConfiguration metódussal nyitja meg az app.config fájlt szerkesztésre, a GetSection metódus pedig a connectionStrings szakaszt adja vissza. A kód ezután ellenőrzi a IsProtected tulajdonságot, és meghívja a ProtectSection szakasz titkosításához, ha nincs titkosítva. A UnprotectSection metódus meghívása a szakasz visszafejtéséhez történik. A Save metódus végrehajtja a műveletet, és menti a módosításokat.

Feljegyzés

A kód futtatásához System.Configuration.dll be kell állítania egy hivatkozást a projektben.

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 példa

Ez a példa a OpenWebConfigurationWebConfigurationManager. Vegye figyelembe, hogy ebben az esetben egy tilde használatával megadhatja a Web.config fájl relatív elérési útját. A kódhoz az osztályra való hivatkozás szükséges System.Web.Configuration .

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

A ASP.NET-alkalmazások védelméről további információt a ASP.NET webhelyek biztonságossá tételével kapcsolatban talál.

Lásd még