2009-02-17 16 views
12

Ho sviluppato un'applicazione .net 3.0, che viene distribuita utilizzando clickonce.Perché la mia applicazione .net richiede pieno affidamento?

Mi piacerebbe passare dalla piena fiducia alla fiducia parziale per facilitare l'implementazione.

Ho provato la funzione "Calcolare i permessi" nella scheda "Protezione" del mio progetto in Visual Studio, e la risposta è abbastanza chiara:

--------------------------- 
Microsoft Visual Studio 
--------------------------- 
This application requires full trust to run correctly. 

Tuttavia, non sono stato in grado di capire perché è richiesta piena fiducia. Ho provato a cambiare le impostazioni di protezione di "fiducia parziale", ma l'applicazione solleva un SecurityException immediatamente al momento del lancio:

System.Security.SecurityException {"Request failed.", Action= "System.Security.Permissions.SecurityAction.LinkDemand" 
    at MyNameSpace.Program.Main(String[] args) 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) 
    at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) 
    at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() 
    at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 
    at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) 
    at System.Activator.CreateInstance(ActivationContext activationContext) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

Il mio software, probabilmente non ha bisogno di piena fiducia (I connettersi solo a un server web tramite https e accedere al filesystem solo su richiesta dell'utente, per scopi di importazione/esportazione)

Come posso capire perché la mia applicazione richiede pieno affidamento?

+0

Cosa stai chiamando nel tuo metodo Main? Qualcosa che stai chiamando lì sta causando il problema. – leppie

+0

Niente. questo è il costruttore predefinito .net Main per una Winform App, IE Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault (false); Application.Run (new MyForm()); e niente di più. Penso che il problema si verifica prima, vale a dire quando il clr carica il mio assembly – Brann

risposta

2

Aggiunta la requirePermission = 'false' attributo nella configSections del App.config aiuta molto:

<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <section requirePermission="false" name="defaultProxy" type="System.Net.Configuration.DefaultProxySection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
    </sectionGroup> 

ha fatto il trucco per me!

0

Hrm, solo una supposizione, ma sta scappando da una condivisione di rete? .NET sembra assegnare la fiducia in base alla posizione da cui viene eseguito il codice. Se proviene da qualsiasi luogo, ma dal tuo disco rigido locale, avrai problemi di sicurezza.

+0

Penso che tu stia guardando la mia domanda in modo sbagliato. Eseguire il file localmente anziché da una condivisione di rete cambierebbe la zona, aumentando così le autorizzazioni predefinite. Non voglio che il mio programma richieda alcun tipo di elevazione per funzionare! – Brann

+0

Ahh sembra che abbia frainteso, scusa Brann –

0

Senza vedere il codice per l'applicazione, è impossibile dirlo. C'è qualcosa di che richiede piena fiducia nella tua app che potresti aver trascurato (forse una dipendenza?).

+0

Non c'è un modo per simulare la logica CLR (che è in grado di determinare che ho bisogno di piena fiducia immediatamente su lanch)? E non è possibile dire al CLR di avviare il programma in anticipo e di sollevare eccezioni quando il mio codice richiede qualche elevatio, se mai lo fa? – Brann

1

Il messaggio di eccezione che si sta dicendo, perché non è possibile eseguire con attendibilità parziale:

System.Security.Permissions.SecurityAction.LinkDemand 

Se si copia e incolla che in Google, troverete diversi articoli sullo MSDN che potrebbero aiutare a scoprire perché la tua applicazione richiede piena fiducia.

10

Sembra che il mio problema sia causato dal fatto che il mio assieme è fortemente firmato.

Citato da msdn

In assembly con il nome, un LinkDemand viene applicata a tutti i metodi accessibili al pubblico, proprietà, e gli eventi in esso limitarne l'uso ai chiamanti completamente attendibili. Per disabilitare questa funzione, è necessario applicare AllowPartiallyTrustedCallersAttributeattribute.

sto aggiungendo l'attributo necessario per il mio assemblaggio, e io ti farò sapere come le cose si rivelano:

[assembly:AllowPartiallyTrustedCallers] 

Aggiornamento: Ho aggiunto l'attributo ai miei assemblee, ma io sto anche usando alcuni .net assembly.

Non tutti gli assiemi .net possono essere utilizzati da assembly parzialmente affidabili (here's a list), vale a dire, gruppi WCF (ad es. Sistema.ServiceModel) non è sulla lista

Tuttavia, Microsoft afferma che è possibile utilizzare WCF in un ambiente parzialmente attendibile (see here)

Ho cercato di rimuovere tutte le assemblee non necessari dai miei riferimenti, ho utilizzato i AllowPartiallyTrustedCallers in tutti i miei assemblee, e sto ancora stucked ...

+0

Brann, dovresti usare il commento e modificare le caratteristiche, piuttosto che aggiungere ripetutamente le risposte. Raccomando di unire le tre risposte in questa singola risposta e di prendere nota dei tempi di ogni modifica/aggiornamento prima del contenuto di tale aggiornamento. – jrista

+0

@jrista: queste tre risposte sono diverse (e indicano direzioni diverse), quindi non vedo come sia rilevante il fatto che tutte e tre siano state pubblicate da me ... – Brann

4

Microsoft ha uno strumento chiamato permcalc che analizzano un assembly e produce un file di output XML dettagliata che assomiglia a questo:

<Type Name="MyClass"> 
<Method Sig="instance void .ctor()"> 
<Demand> 
<PermissionSet version="1" class="System.Security.PermissionSet"> 
    <IPermission version="1" class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
    <IPermission version="1" class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
... 
+0

permcalc non è compatibile con .Net 4 – Valentin

0

Lo stack-trace non mostra il tipo di permesso richiesto.

AllowPartiallyTrustedCallers non ti aiuterà in questo caso. Dovrebbe essere specificato sull'obiettivo chiamante, ad es. quando alcune chiamate di codice parzialmente attendibili nell'assembly trusted. Nella tua situazione dovresti esaminare se la tua app chiama in assembly che non hanno questo attributo definito. Se sì allora la vostra applicazione sarà bisogno di correre in piena fiducia e non funzionerà in attendibilità parziale a tutti (questo è il modo CAS viene applicata ed è di progettazione.)

utilizzare Altrimenti permcalc. Ti mostrerà le autorizzazioni che dovrebbero essere abilitate nelle impostazioni di sicurezza del progetto. Tuttavia non sono sicuro che, dopo aver incluso tutti quei vantaggi, avrai ancora "fiducia parziale" o piuttosto piena fiducia con alcune autorizzazioni ridotte. Ciò è dovuto al fatto che il trust parziale è molto restrittivo (apri security.config e controlla le autorizzazioni abilitate!), Per quanto ne so WebPermission non è lì (che è necessario per inviare richieste HTTP), lo stesso con FileIOPermission.

+0

AllowPartiallyTrustedCallers, è quello che ho fatto, ma mi sento come se il msdn doc non fosse aggiornato (ho postato in questo thread una contraddizione tra il msdn doc e un esempio di msdn ..) – Brann

+0

La fiducia parziale non è così restrittiva che dici . Quando si utilizza il trust parziale, il livello di elevazione dipende dalla zona o può essere personalizzato, quindi è possibile avere FileIOPermission se necessario (sebbene FileDialogPermission sia probabilmente sufficiente nella maggior parte dei casi). – Brann

+0

Certo, è possibile personalizzare le autorizzazioni, ma il trust parziale predefinito ha come 6-7 di esse (LocalIntranet un altro paio). – liggett78

Problemi correlati