Partilhar via


Cadeias de conexão e arquivos de configuração

Aplica-se a: .NET Framework .NET

Baixar ADO.NET

A incorporação de cadeias de conexão no código do seu aplicativo pode levar a vulnerabilidades de segurança e problemas de manutenção. As cadeias de conexão não criptografadas compiladas no código-fonte de um aplicativo podem ser visualizadas usando a ferramenta Ildasm.exe (IL Disassembler). Além disso, se a cadeia de conexão for alterada, seu aplicativo deverá ser recompilado. Por esses motivos, recomendamos armazenar cadeias de conexão em um arquivo de configuração do aplicativo.

Trabalhar com ficheiros de configuração de aplicações

Os arquivos de configuração do aplicativo contêm configurações que são específicas para um aplicativo específico. Por exemplo, um aplicativo ASP.NET pode ter um ou mais arquivos web.config e um aplicativo do Windows pode ter um arquivo app.config opcional. Os arquivos de configuração compartilham elementos comuns, embora o nome e o local de um arquivo de configuração variem dependendo do host do aplicativo.

A seção "connectionStrings"

As strings de ligação podem ser armazenadas como pares chave/valor na secção connectionStrings do elemento de configuração de um ficheiro de configuração de aplicação. Os elementos filho incluem adicionar, limpar e remover.

O fragmento do arquivo de configuração a seguir demonstra o esquema e a sintaxe para armazenar uma cadeia de conexão. O atributo name é um nome que fornece para identificar de forma única uma string de ligação, de modo a que possa ser recuperada em tempo de execução. O nome do fornecedor é Microsoft.Data.SqlClient com o Microsoft SqlClient Data Provider para SQL Server.

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

Observação

Você pode salvar parte de uma cadeia de conexão em um arquivo de configuração e usar a DbConnectionStringBuilder classe para concluí-la em tempo de execução. Isto é útil em cenários em que não conhece elementos da cadeia de ligação antecipadamente, ou quando não quer guardar informação sensível num ficheiro de configuração. Para obter mais informações, consulte Construtores de cadeias de conexão.

Utilizar ficheiros de configuração externos

Arquivos de configuração externos são arquivos separados que contêm um fragmento de um arquivo de configuração que consiste em uma única seção. O arquivo de configuração externo é então referenciado pelo arquivo de configuração principal. Armazenar a secção connectionStrings num ficheiro fisicamente separado é útil em situações em que as connectionstrings podem ser editadas após a implementação da aplicação. Por exemplo, o comportamento ASP.NET padrão é reiniciar um domínio de aplicativo quando os arquivos de configuração são modificados, o que resulta na perda de informações de estado. No entanto, modificar um arquivo de configuração externo não causa uma reinicialização do aplicativo. Os arquivos de configuração externos não estão limitados a ASP.NET; eles também podem ser usados por aplicativos do Windows. Além disso, a segurança e as permissões de acesso a arquivos podem ser usadas para restringir o acesso a arquivos de configuração externos. Trabalhar com arquivos de configuração externos em tempo de execução é transparente e não requer codificação especial.

Para armazenar cadeias de ligação num ficheiro de configuração externo, crie um ficheiro separado que contenha apenas a secção connectionStrings . Não inclua elementos, seções ou atributos adicionais. Este exemplo mostra a sintaxe de um arquivo de configuração externo.

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

No ficheiro principal de configuração da aplicação, utiliza-se o atributo configSource para especificar o nome e localização totalmente qualificados do ficheiro externo. Este exemplo refere-se a um arquivo de configuração externo chamado connections.config.

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

Recuperação de Strings de Conexão em Tempo de Execução

O .NET Framework 2.0 introduziu novas classes no System.Configuration namespace para simplificar a recuperação de cadeias de ligação a partir de ficheiros de configuração em tempo de execução. Você pode recuperar programaticamente uma cadeia de conexão por nome ou por nome de provedor.

Observação

O ficheiromachine.config também contém uma secção connectionStrings , que contém as strings de ligação usadas pelo Visual Studio. Ao recuperar cadeias de conexão por nome do fornecedor a partir do ficheiro app.config numa aplicação Windows, as cadeias de conexão no machine.config são carregadas primeiro, e depois as entradas de app.config. Adicionar clear imediatamente após o elemento connectionStrings remove todas as referências herdadas da estrutura de dados na memória, de modo que apenas as cadeias de conexão definidas no ficheiro local app.config são consideradas.

Trabalhar com os ficheiros de configuração

A partir do .NET Framework 2.0, ConfigurationManager é usado ao trabalhar com ficheiros de configuração no computador local, substituindo o arquivo obsoleto ConfigurationSettings. WebConfigurationManager é usado para trabalhar com ASP.NET arquivos de configuração. Ele foi projetado para trabalhar com arquivos de configuração em um servidor Web e permite acesso programático a seções de arquivos de configuração, como system.web.

Observação

O acesso aos arquivos de configuração em tempo de execução requer a concessão de permissões ao chamador; As permissões necessárias dependem do tipo de aplicativo, arquivo de configuração e local. Para mais informações, consulte Usar as Classes de Configuração e WebConfigurationManager para aplicações ASP.NET, e ConfigurationManager para aplicações Windows.

Você pode usar o ConnectionStringSettingsCollection para recuperar cadeias de conexão de arquivos de configuração do aplicativo. Contém uma coleção de ConnectionStringSettings objetos, cada um dos quais representa uma única entrada na secção connectionStrings . Suas propriedades são mapeadas para atributos de cadeia de conexão, permitindo que você recupere uma cadeia de conexão especificando o nome ou o nome do provedor.

Propriedade Description
Name O nome da cadeia de conexão. Corresponde ao atributo name.
ProviderName O nome do provedor totalmente qualificado. Mapeia para o atributo providerName.
ConnectionString A cadeia de conexão. Mapeia para o atributo connectionString .

Exemplo: Listar todas as cadeias de ligação

Este exemplo itera através do ConnectionStringSettingsCollection e exibe as propriedades ConnectionStringSettings.Name, ConnectionStringSettings.ProviderName e ConnectionStringSettings.ConnectionString na janela do console.

Observação

System.Configuration.dll não está incluído em todos os tipos de projeto, e pode ser necessário definir uma referência para usar as classes de configuração. O nome e o local de um determinado arquivo de configuração de aplicativo variam de acordo com o tipo de aplicativo e o processo de hospedagem.

using System.Configuration;

class Program
{
    static void Main()
    {
        GetConnectionStrings();
        Console.ReadLine();
    }

    static void GetConnectionStrings()
    {
        ConnectionStringSettingsCollection settings =
            ConfigurationManager.ConnectionStrings;

        if (settings != null)
        {
            foreach(ConnectionStringSettings cs in settings)
            {
                Console.WriteLine(cs.Name);
                Console.WriteLine(cs.ProviderName);
                Console.WriteLine(cs.ConnectionString);
            }
        }
    }
}

Exemplo: Recuperar uma cadeia de ligação pelo nome

Este exemplo demonstra como recuperar uma cadeia de conexão de um arquivo de configuração especificando seu nome. O código cria um ConnectionStringSettings objeto, combinando o parâmetro de entrada fornecido com o ConnectionStrings nome. Se nenhum nome correspondente for encontrado, a função retornará null (Nothing no Visual Basic).

// Retrieves a connection string by name.
// Returns null if the name is not found.
static string GetConnectionStringByName(string name)
{
    // Assume failure.
    string returnValue = null;

    // Look for the name in the connectionStrings section.
    ConnectionStringSettings settings =
        ConfigurationManager.ConnectionStrings[name];

    // If found, return the connection string.
    if (settings != null)
        returnValue = settings.ConnectionString;

    return returnValue;
}

Exemplo: Recuperar uma cadeia de ligação pelo nome do fornecedor

Este exemplo demonstra como recuperar uma string de ligação especificando o nome do fornecedor no formato Microsoft.Data.SqlClient. O código itera através do ConnectionStringSettingsCollection e retorna a cadeia de conexão para o primeiro ProviderName encontrado. Se o nome do provedor não for encontrado, a função retornará null (Nothing no 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)
{
    // Return null on failure.
    string returnValue = null;

    // 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)
                returnValue = cs.ConnectionString;
            break;
        }
    }
    return returnValue;
}

Encriptar secções de ficheiros de configuração usando configuração protegida

ASP.NET 2.0 introduziu um novo recurso, chamado configuração protegida, que permite criptografar informações confidenciais em um arquivo de configuração. Embora projetada principalmente para ASP.NET, a configuração protegida também pode ser usada para criptografar seções de arquivos de configuração em aplicativos do Windows. Para uma descrição detalhada das capacidades de configuração protegida, veja Encriptação de Informação de Configuração Usando Configuração Protegida.

O seguinte fragmento de ficheiro de configuração mostra a secção connectionStrings depois de ter sido encriptada. O configProtectionProvider especifica o fornecedor de configuração protegida usado para encriptar e desencriptar as strings de ligação. A secção EncryptedData contém o texto cifrado.

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

Quando a cadeia de ligação encriptada é recuperada em tempo de execução, o .NET Framework utiliza o fornecedor especificado para desencriptar o CipherValue e disponibilizá-lo à sua aplicação. Não precisa de escrever nenhum código adicional para gerir o processo de desencriptação.

Fornecedores de configuração protegida

Os fornecedores de configuração protegida estão registados na secção configProtectedData do ficheiromachine.config no computador local, como mostrado no segmento seguinte, que mostra os dois fornecedores de configuração protegidos fornecidos com o .NET Framework. Os valores mostrados aqui foram truncados para facilitar a leitura.

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

Você pode configurar provedores de configuração protegidos adicionais adicionando-os ao arquivo machine.config . Você também pode criar seu próprio provedor de configuração protegido herdando da ProtectedConfigurationProvider classe base abstrata. A tabela seguinte descreve os dois ficheiros de configuração incluídos no .NET Framework.

Provider Description
RsaProtectedConfigurationProvider Utiliza o algoritmo de encriptação RSA para encriptar e desencriptar dados. O algoritmo RSA pode ser usado para criptografia de chave pública e assinaturas digitais. Também é conhecida como "chave pública" ou criptografia assimétrica porque emprega duas chaves diferentes. Você pode usar a ASP.NET Ferramenta de Registro do IIS (Aspnet_regiis.exe) para criptografar seções em um arquivo Web.config e gerenciar as chaves de criptografia. ASP.NET desencripta o ficheiro de configuração quando processa o ficheiro. A identidade do aplicativo ASP.NET deve ter acesso de leitura à chave de criptografia usada para criptografar e descriptografar as seções criptografadas.
DpapiProtectedConfigurationProvider Usa a API de Proteção de Dados do Windows (DPAPI) para criptografar seções de configuração. Ele usa os serviços de criptografia internos do Windows e pode ser configurado para proteção específica da máquina ou da conta do usuário. A proteção específica da máquina é útil para vários aplicativos no mesmo servidor que precisam compartilhar informações. A proteção específica da conta de usuário pode ser usada com serviços executados com uma identidade de usuário específica, como um ambiente de hospedagem compartilhada. Cada aplicação corre sob uma identidade separada, o que restringe o acesso a recursos como ficheiros e bases de dados.

Ambos os fornecedores oferecem uma forte encriptação de dados. No entanto, se você estiver planejando usar o mesmo arquivo de configuração criptografado em vários servidores, como uma Web farm, somente o RsaProtectedConfigurationProvider permitirá exportar as chaves de criptografia usadas para criptografar os dados e importá-los em outro servidor. Para obter mais informações, consulte Importando e exportando contêineres de chave RSA de configuração protegida.

Usar as classes de configuração

O System.Configuration namespace fornece classes para trabalhar com definições de configuração programaticamente. A ConfigurationManager classe fornece acesso a arquivos de configuração de máquina, aplicativo e usuário. Se você estiver criando um aplicativo ASP.NET, poderá usar a WebConfigurationManager classe, que fornece a mesma funcionalidade e, ao mesmo tempo, permite que você acesse configurações exclusivas para ASP.NET aplicativos, como as encontradas em <system.web>.

Observação

O System.Security.Cryptography namespace contém classes que fornecem opções adicionais para criptografar e descriptografar dados. Use essas classes se precisar de serviços criptográficos que não estão disponíveis usando a configuração protegida. Algumas dessas classes são wrappers para a Microsoft CryptoAPI não gerenciada, enquanto outras são implementações puramente gerenciadas. Para obter mais informações, consulte Serviços criptográficos.

Exemplo de App.config

Este exemplo demonstra como alternar a encriptação da secção connectionStrings num ficheiroapp.config para uma aplicação Windows. Neste exemplo, o procedimento usa o nome do aplicativo como um argumento, por exemplo, "MyApplication.exe". O ficheiroapp.config será então encriptado e copiado para a pasta que contém o executável sob o nome de "MyApplication.exe.config".

Observação

A cadeia de ligação só pode ser desencriptada no computador onde foi encriptada.

O código usa o OpenExeConfiguration método para abrir o ficheiro app.config para edição, e o GetSection método devolve a secção connectionStrings . Em seguida, o código verifica a IsProtected propriedade, chamando o ProtectSection para criptografar a seção se ela não estiver criptografada. O UnprotectSection método é invocado para desencriptar a secção. O Save método completa a operação e guarda as alterações.

Observação

Deves definir uma referência para System.Configuration.dll no teu projeto para que o código seja executado.

static void ToggleConfigEncryption(string exeFile)
{
    // Takes the executable file name without the
    // .config extension.
    try
    {
        // Open the configuration file and retrieve
        // the connectionStrings section.
        Configuration config = ConfigurationManager.
            OpenExeConfiguration(exeConfigName);

        ConnectionStringsSection section =
            config.GetSection("connectionStrings")
            as ConnectionStringsSection;

        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);
    }
}

Exemplo de Web.config

Este exemplo usa o OpenWebConfiguration método do WebConfigurationManager. Note que, neste caso, pode fornecer o caminho relativo ao ficheiroWeb.config usando um tilde. O código requer uma referência à System.Web.Configuration classe.

static void ToggleWebEncrypt()
{
    // Open the Web.config file.
    Configuration config = WebConfigurationManager.
        OpenWebConfiguration("~");

    // Get the connectionStrings section.
    ConnectionStringsSection 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();
}

Para obter mais informações sobre como proteger aplicativos ASP.NET, consulte Protegendo ASP.NET sites.

Consulte também