visual studio net .net permissions .net-3.5 clickonce

studio - ¿Por qué mi aplicación.net requiere plena confianza?



visual studio 2015 clickonce (7)

El mensaje de excepción le dice por qué no puede ejecutar con confianza parcial:

System.Security.Permissions.SecurityAction.LinkDemand

Si copia y pega eso en Google, encontrará varios artículos relevantes en MSDN que podrían ayudarlo a descubrir por qué su aplicación requiere plena confianza.

Desarrollé una aplicación .NET 3.0, que se implementa con clickonce.

Me gustaría pasar de la confianza total a la confianza parcial para facilitar la implementación.

Probé la herramienta "Calcular permisos" en la pestaña "Seguridad" de mi proyecto en Visual Studio, y la respuesta es bastante clara:

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

Sin embargo, no he podido averiguar por qué se requiere plena confianza. Intenté cambiar la configuración de seguridad a "confianza parcial", pero la aplicación genera una SecurityException inmediatamente después del lanzamiento:

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()

Mi software probablemente no necesita plena confianza (solo me conecto a un servidor web usando https, y accedo al sistema de archivos solo cuando el usuario lo solicita, para fines de importación / exportación)

¿Cómo puedo averiguar por qué mi aplicación requiere plena confianza?


Hrm, solo una conjetura, pero ¿se está ejecutando en un recurso compartido de red? .NET parece asignar confianza en función de la ubicación desde la que se ejecuta el código. Si es desde cualquier lugar que no sea su disco duro local, entonces tendrá problemas de seguridad.


Microsoft tiene una herramienta llamada permcalc que analiza un ensamblaje y produce un archivo de salida xml detallado que se ve así:

<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" /> ...


Parece que mi problema está causado por el hecho de que mi ensamblaje está fuertemente firmado.

Citado de msdn

En los ensamblados de nombre seguro, se aplica un LinkDemand a todos los métodos, propiedades y eventos de acceso público para restringir su uso a los usuarios que confían plenamente. Para desactivar esta característica, debe aplicar AllowPartiallyTrustedCallersAttributeattribute.

Estoy agregando el atributo necesario a mi ensamblado, y le dejaré saber cómo resultan las cosas:

[assembly:AllowPartiallyTrustedCallers]

Actualización: he agregado el atributo a mis ensamblajes, pero también estoy usando algunos ensamblados .net.

No todos los ensamblados .net pueden ser utilizados por ensamblajes parcialmente confiables ( aquí hay una lista ), a saber, los ensamblados WCF (es decir, System.ServiceModel) no están en la lista

Sin embargo, Microsoft afirma que es posible usar WCF en un entorno de confianza parcial ( ver aquí )

Intenté eliminar todos los ensamblajes innecesarios de mis referencias, utilicé AllowPartiallyTrustedCallers en todos mis ensamblajes y todavía estoy sorprendido ...


Sin ver el código de su aplicación, es imposible saberlo. Hay algo que requiere confianza total en su aplicación que podría haber pasado por alto (¿quizás una dependencia?).


Su stack-trace no muestra el tipo de permiso que se solicita.

AllowPartiallyTrustedCallers no lo ayudará en este caso. Se debe especificar en el destino de la llamada, por ejemplo, cuando un código parcialmente confiable llama a su ensamblado de confianza. En su situación, debería examinar si su aplicación llama a ensamblajes que no tienen este atributo definido. En caso afirmativo, su aplicación deberá ejecutarse con plena confianza y no funcionará en absoluto (esto es cómo se aplica CAS y es por diseño).

De lo contrario, use permcalc. Le mostrará los permisos que deberían habilitarse en la configuración de seguridad del proyecto. Sin embargo, no estoy seguro de si, después de incluir todas esas permanentes, todavía tendrá "confianza parcial" o más bien confianza total con unos pocos permisos despojados. Esto se debe al hecho de que la confianza parcial es muy restrictiva (open security.config y mira los permisos habilitados), hasta donde sé WebPermission no está allí (lo cual es necesario para enviar solicitudes http), lo mismo con FileIOPermission.


Agregar el atributo requirePermission = ''false'' en las configuraciones de app.config ayuda mucho:

<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>

¡Me hizo el truco!