为什么我的.net应用程序需要完全信任?

时间:2009-02-17 16:56:26

标签: .net permissions .net-3.5 clickonce

我开发了一个.net 3.0应用程序,它是使用clickonce部署的。

我想从完全信任转向部分信任,以便轻松部署。

我在visual studio的项目“安全”选项卡中尝试了“计算权限”工具,答案非常明确:

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

但是,我无法弄清楚为什么需要完全信任。我试图将安全设置更改为“部分信任”,但应用程序在启动时会立即引发SecurityException:

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

我的软件可能不需要完全信任(我只使用https连接到网络服务器,并且仅在用户请求时访问文件系统,用于导入/导出目的)

如何弄清楚我的申请需要完全信任的原因?

7 个答案:

答案 0 :(得分:10)

看来我的问题是由于我的装配是强烈签名的。

引自msdn

  

在强名称程序集中,LinkDemand应用于其中所有可公开访问的方法,属性和事件,以限制它们用于完全信任的调用者。要禁用此功能,必须应用AllowPartiallyTrustedCallersAttributeattribute。

我正在为我的程序集添加所需的属性,我会告诉你事情的结果:

[assembly:AllowPartiallyTrustedCallers]

更新:我已将该属性添加到我的程序集中,但我也使用了一些.net程序集。

并非所有.net程序集都可以被部分受信任的程序集(here's a list)使用,即WCF程序集(即System.ServiceModel)不在列表中

但是,Microsoft声明可以在部分信任环境中使用WCF(see here

我试图从我的引用中删除所有不需要的程序集,我在所有程序集中都使用了AllowPartiallyTrustedCallers,但我仍然被卡住......

答案 1 :(得分:4)

Microsoft有一个名为permcalc的工具,它可以分析程序集并生成一个详细的xml输出文件,如下所示:

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

答案 2 :(得分:2)

在app.config的配置中添加requirePermission ='false'属性有很大帮助:

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

它为我制作了诀窍!

答案 3 :(得分:1)

异常消息告诉您无法使用部分信任运行的原因:

System.Security.Permissions.SecurityAction.LinkDemand

如果您将其复制并粘贴到Google中,您会在MSDN上找到一些相关文章,这些文章可能会帮助您了解您的应用程序需要完全信任的原因。

答案 4 :(得分:0)

嗯,只是一个猜测,但它是否正在运行网络共享? .NET似乎根据运行代码的位置来分配信任。如果它来自任何地方,除了您的本地硬盘驱动器,那么您将遇到安全问题。

答案 5 :(得分:0)

如果没有看到您的应用程序的代码,就无法分辨。 某些需要您可能忽略的应用程序中的完全信任(可能是依赖项?)。

答案 6 :(得分:0)

您的堆栈跟踪未显示所需的权限类型。

在这种情况下,

AllowPartiallyTrustedCallers不会帮助您。它应该在调用目标上指定,例如当某些部分受信任的代码调用您的可信装配时。在您的情况下,您应该检查您的应用程序是否调用未定义此属性的程序集。如果是,则您的应用程序将需要以完全信任的方式运行,并且根本不会部分信任(这是CAS的实施方式,并且是设计的。)

否则使用permcalc。它将显示应在项目的安全设置中启用的权限。但是我不确定在包含所有这些权限之后,你仍然会有“部分信任”或者说具有一些精简权限的完全信任。这是因为部分信任非常严格(打开security.config并查看启用的权限!),据我所知,WebPermission不存在(需要发送http请求),与FileIOPermission相同。 / p>