Bağlantı dizeleri ve yapılandırma dosyaları
Uygulamanızın koduna bağlantı dizesi eklemek güvenlik açıklarına ve bakım sorunlarına yol açabilir. Bir uygulamanın kaynak kodunda derlenen şifrelenmemiş bağlantı dizesi, Ildasm.exe (IL Disassembler) aracı kullanılarak görüntülenebilir. Ayrıca, bağlantı dizesi değişirse uygulamanızın yeniden derlenmiş olması gerekir. Bu nedenlerden dolayı, bağlantı dizesi'leri bir uygulama yapılandırma dosyasında depolamanızı öneririz.
Önemli
Microsoft, kullanılabilir en güvenli kimlik doğrulama akışını kullanmanızı önerir. Azure SQL'e bağlanıyorsanız önerilen kimlik doğrulama yöntemi Azure kaynakları için Yönetilen Kimlikler'dir.
Uygulama Yapılandırma Dosyaları
Uygulama yapılandırma dosyaları belirli bir uygulamaya özgü ayarlar içerir. Örneğin, bir ASP.NET uygulamasının bir veya daha fazla web.config dosyası olabilir ve Windows uygulamasının isteğe bağlı bir app.config dosyası olabilir. Yapılandırma dosyalarının adı ve konumu uygulamanın konağına bağlı olarak değişse de, yapılandırma dosyaları ortak öğeleri paylaşır.
Bölüm connectionStrings
Bağlantı dizeleri, bir uygulama yapılandırma dosyasının yapılandırma öğesinin connectionStrings bölümünde anahtar/değer çiftleri olarak depolanabilir. Alt öğeler ekleme, temizleme ve kaldırmayı içerir.
Aşağıdaki yapılandırma dosyası parçası, bir bağlantı dizesi depolamak için şemayı ve söz dizimini gösterir. name özniteliği, çalışma zamanında alınabilmesi için bir bağlantı dizesi benzersiz olarak tanımlamak için sağladığınız bir addır. providerName, machine.config dosyasında kayıtlı olan .NET Framework veri sağlayıcısının sabit adıdır.
<?xml version='1.0' encoding='utf-8'?>
<configuration>
<connectionStrings>
<clear />
<add name="Name"
providerName="System.Data.ProviderName"
connectionString="Valid Connection String;" />
</connectionStrings>
</configuration>
Not
Bağlantı dizesi bir bölümünü bir yapılandırma dosyasına kaydedebilir ve sınıfını DbConnectionStringBuilder kullanarak çalışma zamanında tamamlayabilirsiniz. Bu, bağlantı dizesi öğelerini önceden bilmediğiniz veya hassas bilgileri bir yapılandırma dosyasına kaydetmek istemediğiniz senaryolarda kullanışlıdır. Daha fazla bilgi için bkz . Bağlantı Dizesi Oluşturucuları.
Dış Yapılandırma Dosyalarını Kullanma
Dış yapılandırma dosyaları, tek bir bölümden oluşan bir yapılandırma dosyasının parçasını içeren ayrı dosyalardır. Ardından dış yapılandırma dosyasına ana yapılandırma dosyası tarafından başvurulur. connectionStrings bölümünü fiziksel olarak ayrı bir dosyada depolamak, uygulama dağıtıldıktan sonra bağlantı dizesi düzenlenebileceği durumlarda yararlıdır. Örneğin, standart ASP.NET davranışı, yapılandırma dosyaları değiştirildiğinde bir uygulama etki alanını yeniden başlatmaktır ve bu da durum bilgilerinin kaybolmasına neden olur. Ancak, bir dış yapılandırma dosyasının değiştirilmesi uygulamanın yeniden başlatılmasına neden olmaz. Dış yapılandırma dosyaları ASP.NET ile sınırlı değildir; Bunlar Windows uygulamaları tarafından da kullanılabilir. Ayrıca, dış yapılandırma dosyalarına erişimi kısıtlamak için dosya erişim güvenliği ve izinleri kullanılabilir. Çalışma zamanında dış yapılandırma dosyalarıyla çalışmak saydamdır ve özel kodlama gerektirmez.
bağlantı dizesi bir dış yapılandırma dosyasında depolamak için yalnızca connectionStrings bölümünü içeren ayrı bir dosya oluşturun. Ek öğe, bölüm veya öznitelik eklemeyin. Bu örnekte, dış yapılandırma dosyasının söz dizimi gösterilir.
<connectionStrings>
<add name="Name"
providerName="System.Data.ProviderName"
connectionString="Valid Connection String;" />
</connectionStrings>
Ana uygulama yapılandırma dosyasında, dış dosyanın tam adını ve konumunu belirtmek için configSource özniteliğini kullanırsınız. Bu örnek adlı connections.config
bir dış yapılandırma dosyasına başvurur.
<?xml version='1.0' encoding='utf-8'?>
<configuration>
<connectionStrings configSource="connections.config"/>
</configuration>
Çalışma Zamanında Bağlantı Dizelerini Alma
.NET Framework 2.0, çalışma zamanında yapılandırma dosyalarından bağlantı dizesi almayı kolaylaştırmak için ad alanında yeni sınıflar System.Configuration kullanıma sunulmuştur. Bir bağlantı dizesi ada veya sağlayıcı adına göre program aracılığıyla alabilirsiniz.
Not
machine.config dosyası, Visual Studio tarafından kullanılan bağlantı dizesi içeren connectionStrings bölümünü de içerir. Windows uygulamasındaki app.config dosyasından sağlayıcı adına göre bağlantı dizesi alırken, önce machine.config dosyasındaki bağlantı dizesi, ardından app.config dosyasındaki girdiler yüklenir. connectionStrings öğesinden hemen sonra clear eklendiğinde, bellekteki veri yapısından devralınan tüm başvurular kaldırılır, böylece yalnızca yerel app.config dosyasında tanımlanan bağlantı dizesi dikkate alınır.
Yapılandırma Sınıfları ile çalışma
.NET Framework 2.0'dan başlayarak, ConfigurationManager yerel bilgisayarda yapılandırma dosyalarıyla çalışırken kullanım dışı bırakılmış ConfigurationSettings sınıfın yerine kullanılır. WebConfigurationManager ASP.NET yapılandırma dosyalarıyla çalışmak için kullanılır. Bir Web sunucusundaki yapılandırma dosyalarıyla çalışacak şekilde tasarlanmıştır ve system.web gibi yapılandırma dosyası bölümlerine programlı erişim sağlar.
Not
Çalışma zamanında yapılandırma dosyalarına erişmek için çağırana izin verilmesi gerekir; gerekli izinler uygulama türüne, yapılandırma dosyasına ve konuma bağlıdır. Daha fazla bilgi için bkz WebConfigurationManager . ASP.NET uygulamaları ve ConfigurationManager Windows uygulamaları için.
uygulamasını kullanarak ConnectionStringSettingsCollection uygulama yapılandırma dosyalarından bağlantı dizesi alabilirsiniz. Her biri ConnectionStringSettings connectionStrings bölümündeki tek bir girişi temsil eden bir nesne koleksiyonu içerir. Özellikleri bağlantı dizesi öznitelikleriyle eşlenerek adı veya sağlayıcı adını belirterek bir bağlantı dizesi almanıza olanak sağlar.
Özellik | Açıklama |
---|---|
Name | bağlantı dizesi adı. Ad özniteliğiyle eşler. |
ProviderName | Tam sağlayıcı adı. providerName özniteliğiyle eşler. |
ConnectionString | Bağlantı dizesi. connectionString özniteliğine eşler . |
Örnek: Tüm Bağlantı Dizelerini Listele
Bu örnek içinde yinelenir ConnectionStringSettingsCollection ve konsol penceresinde , ConnectionStringSettings.ProviderNameve ConnectionStringSettings.ConnectionString özelliklerini görüntülerConnectionStringSettings.Name.
Not
System.Configuration.dll tüm proje türlerine dahil değildir ve yapılandırma sınıflarını kullanmak için buna bir başvuru ayarlamanız gerekebilir. Belirli bir uygulama yapılandırma dosyasının adı ve konumu, uygulama türüne ve barındırma işlemine göre değişir.
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
Örnek: Ada Göre Bağlantı Dizesi Alma
Bu örnekte, bir yapılandırma dosyasından adını belirterek bir bağlantı dizesi nasıl alınacağını gösterir. Kod, sağlanan giriş parametresini ConnectionStrings adla eşleştiren bir ConnectionStringSettings nesne oluşturur. Eşleşen ad bulunmazsa, işlev döndürür null
(Nothing
Visual Basic'te).
// 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
Örnek: Sağlayıcı Adına Göre Bağlantı Dizesi Alma
Bu örnekte, System.Data.ProviderName biçiminde sağlayıcı sabit adını belirterek bir bağlantı dizesi nasıl alınacağını gösterir. Kod aracılığıyla yinelenir ConnectionStringSettingsCollection ve ilk ProviderName bulunan için bağlantı dizesi döndürür. Sağlayıcı adı bulunamazsa, işlev (Nothing
Visual Basic'te) döndürür null
.
// 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
Korumalı Yapılandırma Kullanarak Yapılandırma Dosyası Bölümlerini Şifreleme
ASP.NET 2.0, bir yapılandırma dosyasındaki hassas bilgileri şifrelemenizi sağlayan korumalı yapılandırma adlı yeni bir özellik kullanıma sunulmuştur. Öncelikli olarak ASP.NET için tasarlanmış olsa da korumalı yapılandırma, Windows uygulamalarında yapılandırma dosyası bölümlerini şifrelemek için de kullanılabilir.
Aşağıdaki yapılandırma dosyası parçası, şifrelendikten sonra connectionStrings bölümünü gösterir. configProtectionProvider, bağlantı dizesi şifrelemek ve şifresini çözmek için kullanılan korumalı yapılandırma sağlayıcısını belirtir. EncryptedData bölümü şifreleme metnini içerir.
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAH2... </CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
Şifrelenmiş bağlantı dizesi çalışma zamanında alındığında, .NET Framework Belirtilen sağlayıcıyı kullanarak CipherValue şifresini çözer ve uygulamanızın kullanımına sağlar. Şifre çözme işlemini yönetmek için ek kod yazmanız gerekmez.
Korumalı Yapılandırma Sağlayıcıları
Korumalı yapılandırma sağlayıcıları, .NET Framework ile sağlanan iki korumalı yapılandırma sağlayıcısını gösteren aşağıdaki parçada gösterildiği gibi yerel bilgisayardaki machine.config dosyasının configProtectedData bölümüne kaydedilir. Burada gösterilen değerler okunabilirlik için kesilmiştir.
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">
<providers>
<add name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider" />
<add name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider" />
</providers>
</configProtectedData>
Ek korumalı yapılandırma sağlayıcılarını machine.config dosyasına ekleyerek yapılandırabilirsiniz. Soyut temel sınıftan ProtectedConfigurationProvider devralarak kendi korumalı yapılandırma sağlayıcınızı da oluşturabilirsiniz. Aşağıdaki tabloda .NET Framework ile birlikte gelen iki yapılandırma dosyası açıklanmaktadır.
Provider | Açıklama |
---|---|
RsaProtectedConfigurationProvider | Verileri şifrelemek ve şifresini çözmek için RSA şifreleme algoritmasını kullanır. RSA algoritması hem ortak anahtar şifrelemesi hem de dijital imzalar için kullanılabilir. İki farklı anahtar içerdiği için "ortak anahtar" veya asimetrik şifreleme olarak da bilinir. Web.config dosyasındaki bölümleri şifrelemek ve şifreleme anahtarlarını yönetmek için ASP.NET IIS Kayıt Aracı'nı (Aspnet_regiis.exe) kullanabilirsiniz. ASP.NET, dosyayı işlerken yapılandırma dosyasının şifresini çözer. ASP.NET uygulamasının kimliği, şifrelenmiş bölümleri şifrelemek ve şifresini çözmek için kullanılan şifreleme anahtarına okuma erişimine sahip olmalıdır. |
DpapiProtectedConfigurationProvider | Yapılandırma bölümlerini şifrelemek için Windows Veri Koruma API'sini (DPAPI) kullanır. Windows yerleşik şifreleme hizmetlerini kullanır ve makineye veya kullanıcıya özgü koruma için yapılandırılabilir. Makineye özgü koruma, aynı sunucuda bilgi paylaşması gereken birden çok uygulama için kullanışlıdır. Kullanıcı hesabına özgü koruma, paylaşılan barındırma ortamı gibi belirli bir kullanıcı kimliğiyle çalışan hizmetlerle kullanılabilir. Her uygulama, dosyalar ve veritabanları gibi kaynaklara erişimi kısıtlayan ayrı bir kimlik altında çalışır. |
Her iki sağlayıcı da güçlü veri şifrelemesi sunar. Ancak, web grubu gibi birden çok sunucuda aynı şifrelenmiş yapılandırma dosyasını kullanmayı planlıyorsanız, verileri şifrelemek ve bunları başka bir sunucuya aktarmak için kullanılan şifreleme anahtarlarını dışarı aktarmanıza yalnızca RsaProtectedConfigurationProvider bu olanak sağlar. Daha fazla bilgi için bkz . Korumalı Yapılandırma RSA Anahtar Kapsayıcılarını İçeri ve Dışarı Aktarma.
Yapılandırma Sınıflarını Kullanma
Ad System.Configuration alanı, yapılandırma ayarlarıyla program aracılığıyla çalışmak için sınıflar sağlar. ConfigurationManager sınıfı makine, uygulama ve kullanıcı yapılandırma dosyalarına erişim sağlar. bir ASP.NET uygulaması oluşturuyorsanız, aynı işlevselliği sağlarken system.web'de bulunanlar< gibi ASP.NET uygulamalara özgü ayarlara da erişmenizi sağlayan sınıfını kullanabilirsinizWebConfigurationManager.>
Not
Ad System.Security.Cryptography alanı, verileri şifrelemek ve şifresini çözmek için ek seçenekler sağlayan sınıflar içerir. Korumalı yapılandırma kullanılarak kullanılamayan şifreleme hizmetlerine ihtiyacınız varsa bu sınıfları kullanın. Bu sınıflardan bazıları yönetilmeyen Microsoft CryptoAPI için sarmalayıcılardır, diğerleri ise tamamen yönetilen uygulamalardır.
App.config Örneği
Bu örnekte, bir Windows uygulaması için app.config dosyasında connectionStrings bölümünün şifrelenmesine nasıl geçiş yapılacağını gösterilmektedir. Bu örnekte yordam, uygulamanın adını bağımsız değişken olarak alır, örneğin, "MyApplication.exe". App.config dosyası daha sonra şifrelenir ve "MyApplication.exe.config" adı altında yürütülebilir dosyayı içeren klasöre kopyalanır.
Kod, app.config dosyasını düzenlemek üzere açmak için yöntemini kullanır OpenExeConfiguration ve GetSection yöntemi connectionStrings bölümünü döndürür. Kod daha sonra özelliğini denetler IsProtected ve şifrelenmemişse bölümünü şifrelemek için öğesini çağırır ProtectSection . UnprotectSection yöntemi, bölümün şifresini çözmek için çağrılır. (bağlantı dizesi yalnızca şifrelendiği bilgisayarda çözülebilir.) Save yöntemi işlemi tamamlar ve değişiklikleri kaydeder.
Kodun çalışması için System.Configuration.dll
projenize bir başvuru eklemeniz gerekir.
Önemli
Microsoft, kullanılabilir en güvenli kimlik doğrulama akışını kullanmanızı önerir. Azure SQL'e bağlanıyorsanız önerilen kimlik doğrulama yöntemi Azure kaynakları için Yönetilen Kimlikler'dir.
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 Örneği
Bu örnekte yöntemini OpenWebConfiguration WebConfigurationManager
kullanır. Bu durumda, tilde kullanarak Web.config dosyasının göreli yolunu sağlayabilirsiniz. Kod, sınıfına System.Web.Configuration
bir başvuru gerektirir.
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
ASP.NET uygulamaların güvenliğini sağlama hakkında daha fazla bilgi için bkz . ASP.NET web sitelerinin güvenliğini sağlama.