2011-09-06 12 views
8

nel codiceConfigurationManage -> section.SectionInformation.ProtectSection() dipende dalla macchina?

Configuration config = ConfigurationManager.OpenExeConfiguration (Application.ExecutablePath); 
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection; 
if (!section.SectionInformation.IsProtected) 
{ 
    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); 
} 

sto ottenendo qualche problema quando ho spostare l'applicazione su un'altra macchina.

è la sezione. SectionInformation.ProtectSection call machine dependent, ovvero non riesco a copiare il file di configurazione e utilizzarlo su un'altra macchina?

Esiste un provider (diverso da DataProtectionConfigurationProvider) indipendente dal computer?

È un requisito per la mia applicazione che funzioni su più macchine con lo stesso file di configurazione (deve essere eseguito da un'unità flash).

Grazie, Fábio

risposta

10

La macchina è chiamata section.SectionInformation.ProtectSection dipendente, significato, non riesco a copiare il file di configurazione e lo uso su un'altra macchina?

Sì, è corretto per quanto posso dire. This article dice che le chiavi sono memorizzate su una macchina o per utente.

Esiste un provider (diverso da DataProtectionConfigurationProvider) indipendente dal computer?

Non fuori dalla scatola, i due fornitori So di (DataProtectionConfigurationProvider e RSAProtectedConfigurationProvider) entrambi hanno lo stesso "problema". Ho trovato alcuni suggerimenti sul fatto che il provider RSA consente di riutilizzare chiavi su macchine, ma non ho trovato alcun esempio su come ottenere ciò.

Tuttavia, c'è un modo per ottenere ciò di cui hai bisogno, l'ho fatto da solo ieri dato che avevo un problema simile (avevo bisogno di eseguire un'app da un percorso di rete e tutti i client dovevano condividere lo stesso file di configurazione crittografato). Puoi arrotolare il tuo ProtectedConfigurationProvider. Ecco alcuni link che illustrano il concetto:

L'utilizzo di questi articoli, sono stato in grado di costruire il mio ProtectedConfigurationProvider che non è a macchina o dall'utente dipendente e usarlo in un'applicazione. Ho un passaggio post-build nel mio build di release che protegge la sezione config e pertanto distribuisco sempre e solo la versione protetta di esso. Ottenere i dati della sezione protetta funziona come ci si aspetterebbe su altre macchine senza problemi. Certo, devi stare molto attento a come crittografare e decifrare le tue sezioni in modo sicuro. Ci sono alcuni esempi là fuori che delineano come farlo, this è uno di quelli che penso.

Una delle cose che non è chiaramente indicato in uno dei tre articoli è come fare in modo che l'app trovi il provider se non si utilizza ASP.net. Il solito modo di installarlo nella cache di assembly globale probabilmente non funzionerà per te dato che dichiari di eseguire un'applicazione da un'unità flash.Quindi, avresti bisogno di aggiungerlo al file app.config invece, simile a questo:

<?xml version="1.0"?> 
<configuration> 
    ... 
    <configProtectedData defaultProvider="MyEncryptionProvider"> 
    <providers> 
     <add name="MyEncryptionProvider" 
     type="MyAssembly.MyEncryptionProvider, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=whatever_the_assembly_token_is" /> 
    </providers> 
    </configProtectedData> 
    ... 
</configuration> 

Questo dovrebbe funzionare se l'assembly che fa la crittografia è nello stesso percorso come assemblaggio principale. Sto usando un assembly firmato, sn -T {Assembly} ti darà il PublicKeyToken che devi inserire nel file di configurazione.

Protezione Una sezione è poi fatto simile a questo:

using System.Configuration; 

... 

Configuration oConfiguration = ConfigurationManager.OpenExeConfiguration(yourExePath); 
oSection.SectionInformation.ProtectSection("MyEncryptionProvider"); 
oSection.SectionInformation.ForceSave = true; 
oConfiguration.Save(); 

ho provato oggi, e ha funzionato con un file di configurazione vengono codificati su una macchina di sviluppo (XP SP3), e in uso su XP SP2 , Win7 32Bit e Win7 64 Bit.

NEGAZIONE

  • Non sono sicuro se qualcuno di questo funziona se non si firma vostre assemblee.
  • Utilizzare a proprio rischio, non sono un esperto in materia di sicurezza in base a qualsiasi standard.
+0

Takrl, è fantastico. Grazie mille. Ti farò sapere come va. – Fabio

+0

@Fabio Certo, fammi sapere se hai qualche problema ... – takrl

+0

Ciao Ragazzi, ho problemi con la crittografia della configurazione con il mio fornitore di configurazione protetta. Quando chiamo section.SectionInformation.ProtectSection ("AesProvider") mi dà errore, "Il fornitore di protezione 'AesProvider' non è stato trovato." Sembra che quando usi ProtectedConfiguration.Providers sia caricato ma usi la configurazione del programma che non posso usare per crittografare qualche altro file di configurazione. Hai vissuto in questo modo? – flynhigh

Problemi correlati