Juliano Ace Janeiro 2011 Tecnologias: Visual Studio 2010, .NET Framework 4
Sumrio: Apresentarei nesse artigo os benefcios dos arquivos de configurao e como ler e escrever informaes neles. Baixe o cdigo fonte Contedo Introduo Formato dos Arquivos de Configurao Tipos de Arquivos de Configurao Adicionando Arquivo de Configurao Lendo Informaes do Arquivo de Configurao Escrevendo Informaes no Arquivo de Condigurao Arquivos de Configurao em Aplicaes ASP.NET Criptografia Concluso Referncias + Tpicos Relacionados Sobre o Autor Introduo Arquivos de Configurao so arquivos onde podemos guardar informaes que podem ser facilmente alteradas sem a necessidade de recompilao de nossa aplicao, ou seja, basta alterarmos esse arquivo e reiniciar a aplicao que as alteraes sero aplicadas. Esse arquivo um arquivo Extensible Markup Language (XML) e pode ser alterado no famoso Bloco de Notas do Windows. Vou tambm fazer uma breve introduo de como criptografar e decriptografar sees nos arquivos de configurao. Formato dos Arquivos de Configurao Os arquivos de configurao contm elementos. Elementos so estruturas onde definimos as configuraes como por exemplo o elemento onde definimos a connection string, <connectionStrings>. O cdigo </connectionStrings> indica o final do elemento. As configuraes so definidas dentro dos elementos, essas configuraes so definidas atravs de atributos pr-definidos (chave/valor). Abaixo (listagem 1) um exemplo do elemento connectionStrings:
Listagem 1 Elemento connectionStrings Como podemos ver no exemplo acima, temos um elemento add dentro do elemento connectionStrings e vrios atributos (name e providerName) com chave e valor configurando a string de conexo com o banco de dados. Tipos de Arquivos de Configurao Existem trs tipos de arquivos de configurao: Arquivos de configurao de mquina. Arquivos de configurao de aplicao. Arquivos de configurao de segurana. Arquivos de Configurao de Mquina O arquivo de configurao de mquina (Machine.config) contm configuraes a nvel de mquina, ou seja, configuraes que se aplicam em toda a mquina. Ele pode ser encontrado na pasta Config do diretrio de instalao do .NET Framework. <connectionStrings> <add name="MinhaStringDeConexao" connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;" providerName="SqlClient"/> </connectionStrings> Arquivos de Configurao de Aplicao O arquivo de configurao de aplicao contm configuraes para uma aplicao especfica. Se a aplicao for uma aplicao Windows, o arquivo de configurao fica no mesmo diretrio da aplicao. O nome do arquivo de configurao o nome da aplicao mais a extenso .config, ou seja, se temos uma aplicao chamada MinhaAplicacao.exe o arquivo de configurao se chamar MinhaAplicacao.exe.config. Se a aplicao for uma aplicao ASP.NET, o arquivo de configurao se chamar Web.config. Arquivos de Configurao de Segurana O arquivo de configurao de segurana contm configuraes de hierarquia de grupos e permisses associadas aos nveis de poltica de segurana. extremamente recomendado que se use a ferramenta .NET Framework Configuration e/ou a ferramenta Code Access Security Policy para modificar essas configuraes para assegurar que as mudanas no corrompa o arquivo de configurao. Adicionando Arquivo de Configurao Quando criamos uma aplicao do tipo Windows Forms, Windows Presentation Foundation ou Console Application por padro no temos um arquivo de configurao em nosso projeto. Para adicionar basta clicarmos com o boto direito do mouse em cima do projeto na janela Solution Explorer, selecionar a opo Add, New Item... Na janela Add New Item selecionamos o arquivo Application Configuration File, conforme figura 1: Figura 1 Adicionando Application Configuration File ao Projeto Aps adicionarmos o arquivo de configurao, ele aberto no code editor do Visual Studio para que possamos configur-lo. Na primeira linha temos a verso do XML (1.0) e o encoding usado (utf-8). Na linha 2 temos um elemento configuration, dentro dele que adicionamos os elementos necessrios para configurao de nossa aplicao. Como no exemplo acima, vamos definir a connection string para a nossa base de dados, veja listagem 2 abaixo: Listagem 2 App.config Lendo Informaes do Arquivo de Configurao Agora voltando a aplicao (nesse caso criei uma aplicao console chamada MinhaAplicacao), vamos ler as informaes (connectionStrings) contidas no arquivo de configurao. Para fazermos a leitura dessas informaes primeiro precisamos adicionar referncia ao namespaceSystem.configuration. Na imagem 2 abaixo mostro a referncia: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="MinhaStringDeConexao" connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;"/> </connectionStrings> </configuration> Figura 2 Referncia ao namespace System.configuration Depois disso adicionamos a referncia (using) nossa classe Program.cs conforme listagem 3: Listagem 3 Referenciando o Namespace A classe que usamos para ler as informaes a ConfigurationManager. A propriedade que utilizamos para capturar a connection string ConnectionStrings que retorna uma coleo de connectionStrings do arquivo de configurao. Lembrando que podemos ter vrias connections strings no elemento <connectionStrings> no mesmo arquivo de configurao. Para pegarmos uma determinada connection string informamos o ndice ou o nome da mesma, a listagem 4 demonstra esse cdigo: using System.Configuration string connectionString = ConfigurationManager.ConnectionStrings["MinhaStringDeConexao"].ConnectionString; Listagem 4 Lendo a connection string O interessante tambm que podemos adicionar nossas prprias configuraes usando chave/valor para defin-las. Para isso, basta adicionarmos um elemento <appSettings> e dentro dele adicionamos nossos elementos atravs da chave (key) e valor (value), veja a listagem 5: Listagem 5 Elemento appSettings Para lermos essa informao tambm usamos a classe ConfigurationManager, s que agora ao invs de usarmos a propriedade ConnectionStrings usamos a propriedade AppSettings informando o nome da chave, conforme listagem 6 abaixo: Listagem 6 Lendo configurao customizada Na figura 3 mostro o resultado: <appSettings> <add key="EnviarEmailDeErro" value="true"/> </appSettings> bool enviarEmail = Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]); if (enviarEmail) { Console.WriteLine("Enviar email"); } Figura 3 Mostrando configurao customizada Escrevendo Informaes no Arquivo de Configurao Para escrevermos informaes nos arquivos de configurao usamos a classe Configuration. Primeiro abrimos o arquivo de configurao da aplicao atravs do mtodo OpenExeConfiguration da classe ConfigurationManager e atribuimos instncia da classe Configuration. Em seguida determinamos o novo valor da configurao atravs da propriedade Value e por fim chamamos o mtodo Save. Podemos ver todo esse cdigo na listagem 7: bool enviarEmail; enviarEmail = Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]); Console.WriteLine("Enviar email = {0}", enviarEmail.ToString()); Listagem 7 Alterando informaes no arquivo de configurao O mtodo Save da classe Configuration tem um overload que recebe como parmetro uma das opes do enumerador ConfigurationSaveMode, so elas: Modified Salva apenas as propriedades modificadas mesmo que o valor seja o mesmo contido no arquivo de configurao. Minimal Salva apenas as propriedades modificadas desde que os valores sejam diferentes dos valores contidos no arquivo de configurao. Full Salva todas as propriedades. Se verificarmos o resultado (figura 4) podemos ver que no o esperado: Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings["EnviarEmailDeErro"].Value = "false"; config.Save(ConfigurationSaveMode.Modified); Console.WriteLine("\nConfigurao EnviarEmailDeErro alterado para 'false'.\n"); enviarEmail = Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]); Console.WriteLine("Enviar email = {0}", enviarEmail.ToString()); Figura 4 Resultado O valor ainda est como true. Ainda est assim porque como disse acima a aplicao precisa ser reiniciada. Se fecharmos e executarmos a aplicao novamente veremos que a propriedade agora estar como false. Veja o resultado na figura 5: Figura 5 Resultado com a aplicao reiniciada Para evitarmos que a aplicao seja reiniciada para que a alterao seja aplicada podemos chamar o mtodo RefreshSection da classe ConfigurationManager passando o nome da seo que queremos atualizar, no nosso caso a sesso appSettings. Abaixo, na listagem 8, podemos ver como ficar o cdigo e na figura 6 podemos ver o resultado: bool enviarEmail; enviarEmail = Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]); Console.WriteLine("Enviar email = {0}", enviarEmail.ToString()); Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings["EnviarEmailDeErro"].Value = "false"; config.Save(ConfigurationSaveMode.Modified); Listagem 8 Usando o mtodo RefreshSection Console.WriteLine("\nConfigurao EnviarEmailDeErro alterado para 'false'.\n"); enviarEmail = Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]); Console.WriteLine("Enviar email = {0}\n", enviarEmail.ToString()); ConfigurationManager.RefreshSection("appSettings"); Console.WriteLine("Seo appSettings atualizada.\n"); enviarEmail = Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]); Console.WriteLine("Enviar email = {0}\n", enviarEmail.ToString()); Figura 6 Resultado com o mtodo RefreshSection Para adicionarmos uma nova configurao basta usarmos o mtodo Add da propriedade Settings conforme a listagem 9: Listagem 9 Adicionando informaes no arquivo de configurao Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings.Add("Quantidade", "12"); config.Save(); int quantidade = Convert.ToInt32(config.AppSettings.Settings["Quantidade"].Value); Observao: Quando alteramos ou adicionamos algo no arquivo de configurao atravs de cdigo, o arquivo app.config atualizado o que est na pasta da aplicao, no nosso caso, na pasta Debug do projeto e no aquele que criamos no Visual Studio. Se selecionarmos a opo Rebuild Solution no Visual Studio o arquivo de configurao atualizado ser sobrescrito pelo antigo que est na soluo do projeto. Arquivos de Configurao em Aplicaes ASP.NET As alteraes feitas nos arquivos de configurao de aplicaes ASP.NET assim como aplicaes Windows precisam ser reiniciadas para que sejam aplicadas, mas diferentemente de aplicaes Windows, ao alterar qualquer informao no arquivo de configurao de uma aplicao ASP.NET a aplicao reiniciada automaticamente acarretando na perda de todos os dados em memria. Podemos ter vrios arquivos de configurao em uma aplicao ASP.NET, um cenrio onde utilizamos essa tcnica quando precisamos definir permisses em diretrios especficos. Por exemplo, podemos ter um arquivo Web.config na raiz da aplicao contendo uma connection string e um arquivo Web.config em uma pasta que restrita a usurios que pertencem a roleAdministrador. A imagem 6 nos mostra uma aplicao ASP.NET na jalena Solution Explorer com dois arquivos Web.config: Figura 7 Projeto ASP.NET com vria arquivos de configurao Abaixo, temos a listagem 10 demonstrando o cdigo do arquivo Web.config nvel de aplicao e mais abaixo, na listagem 11, temos o cdigo do arquivo Web.config nivel de diretrio (AreaRestrita): Listagem 10 Web.config nvel de aplicao Listagem 11 Web.config nvel de diretrio Criptografia Nada impede de colocarmos dados confidenciais em arquivos de configurao como por exemplo login e senha do banco de dados. Para que no tenhamos problemas podemos criptografar uma determinada seo do arquivo de configurao. Para isso usamos os mtodos ProtectSection e UnprotectSection da classe ConfigurationSection para criptografar e decriptografar, respectivamente. Podemos configurar provedores de segurana adicionando-os no arquivo de configurao machine.config. Podemos tambm criar nossos prprios provedores de segurana criando uma classe herdando da classe ProtectedConfigurationProvider. O .NET Framework fornece dois provedores: <?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <connectionStrings> <add name="MinhaStringDeConexao" connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;"/> </connectionStrings> </configuration> <?xml version="1.0"?> <configuration> <system.web> <authorization> <deny users="*"/> <allow roles="Administrador"/> </authorization> </system.web> </configuration> RSAProtectedConfigurationProvider. DPAPIPProtectedConfigurationProvider. Vamos criar dois mtodos, um chamado Criptografar e outro Decriptografar: Listagem 12 Mtodo Criptografar static void Criptografar() { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConfigurationSection section = config.ConnectionStrings; if (!section.SectionInformation.IsProtected) { section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider"); section.SectionInformation.ForceSave = true; config.Save(); } } static void Decriptografar() { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConnectionStringsSection section = config.ConnectionStrings; if (section.SectionInformation.IsProtected) { section.SectionInformation.UnprotectSection(); Listagem 13 Mtodo Decriptografar Se verificarmos nosso arquivo de configurao veremos que a seo connectionsStrings agora est criptografada. Abaixo, na listagem 14 temos o arquivo de configurao sem criptografia e, na listagem 15, o arquivo de configurao criptografado: Listagem 14 Arquivo de Configurao sem criptografia section.SectionInformation.ForceSave = true; config.Save(); } } <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="MinhaStringDeConexao" connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;" /> </connectionStrings> <appSettings> <add key="EnviarEmailDeErro" value="true"/> </appSettings> </configuration> <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> Listagem 15 Arquivo de Configurao com criptografia Podemos ainda, nos arquivos de configurao de aplicaes ASP.NET criptografar a partir da ferramenta ASP.NET IIS Registration Tool (Aspnet_regiis.exe). Para criptografar a seo connectionStrings usamos o seguinte cdigo no Visual Studio Command Prompt: aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" -prov "RsaProtectedConfigurationProvider" e para decriptografar usamos: aspnet_regiis -pd "connectionStrings" -app "/SampleApplication". Observaes: Como disse na introduo desse artigo, isso apenas uma breve introduo criptografia, para maiores detalhes visite o site http://msdn.microsoft.com/en-us/library/hh8x3tas.aspx. Concluso Podemos ver atravs desse artigo que os arquivos de configurao so muito teis para nossas aplicaes. Podemos ler e escrever informaes atravs das classes que pertencem ao namespace System.configuration. Vimos tambm que necessrio cuidado ao alterar essas informaes em aplicaes ASP.NET pois todos os dados em memria so perdidos. Fiz tambm uma breve introduo de como criptografar sees que contenham dados confidenciais como login e senha do banco de dados. Referncias + Tpicos Relacionados <KeyName>Rsa Key</KeyName> </KeyInfo> <CipherData> <CipherValue>TLw0Y9g1W7+AK7hWglKv2uaJAdP5s3GjsKfTFcaT4HoUG/Gac03ZCRvTJvA35mgJjcaURe8qH2cDFzC/8+kzlTEZvjFERiV4SNBpJQTOsmLBQX3i8cqObmgp3PwBhhYqOH6f7HX9YzFIMUoxflKmb9ighZ9nVfgrjC667hNsplI=</CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>s9oRXbGsdb7fqPXqnSNzLYqlTGQdY6vaBeF/Hr4azYKeGTrSk8u3DRSpYTHZm1vJfdNJIdkf3S7gIllpoObKLeH96BDde8JBhTMidgQ2nBeSg3ohgxpNqizEyS+eztWo3BSTNEY+CISgvLsJh10mJP5UHLsPqTwNUtIkMPeks5jyFC+fpIMCeo9Gem8LxFMmcmR7qYqNkFge+4oMEv+Ycv8nYhz9PFXUgvypq/1eWXQQBGKsYPTOTQ==</CipherValue> </CipherData> </EncryptedData> </connectionStrings> <appSettings> <add key="EnviarEmailDeErro" value="true"/> </appSettings> </configuration> Configuration Files: http://msdn.microsoft.com/en-us/library/1xtk877y(v=VS.100).aspx Classe Configuration: http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx Classe ConfigurationManager: http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx Ferramenta .NET Framework Configuration: http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx Ferramenta Code Access Security: http://msdn.microsoft.com/en-us/library/cb6t8dtz.aspx Encrypting and Decrypting Configuration Sections: http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx Sobre o Autor Juliano Ace, entusiasta por tecnologias Microsoft, desenvolvedor de aplicaes .NET h mais de dois anos. Atualmente trabalha em uma empresa do ramo da sade e escreve artigos regularmente em seu blog (http://julianoaece.wordpress.com). Pode ser contatado atravs do email julianoaece@yahoo.com.br. 2014 Microsoft