【问题标题】:Code Access Security problem - what's the issue here?代码访问安全问题 - 这里有什么问题?
【发布时间】:2010-02-22 15:58:27
【问题描述】:

背景

我有一个构建后事件,我用它来生成一些包含我们应用程序当前版本号的批处理文件。该事件调用一个批处理文件,该文件调用一个managed app,它加载程序集并使用反射来查找其版本信息。

问题

当构建后事件在本地运行时,一切都很好。当它在我们的自动构建过程下运行时,我在日志中看到以下错误。我对代码访问安全一无所知,希望有人能迅速指出问题。

call GenerateBatchFiles.bat Q:\MyApp\MyCompany.Services.Hosts.MyApp.exe

       Unhandled Exception: System.Security.SecurityException: Request failed.
          at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Assembly asm, PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission permThatFailed)
          at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Object assemblyOrString, PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission permThatFailed)
          at System.Security.CodeAccessSecurityEngine.CheckSetHelper(PermissionSet grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle rmh, Object assemblyOrString, SecurityAction action, Boolean throwException)
          at System.Security.CodeAccessSecurityEngine.CheckSetHelper(CompressedStack cs, PermissionSet grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle rmh, Assembly asm, SecurityAction action)
          at Version.Program.Main(String[] args)
       The action that failed was:
       LinkDemand
       The type of the first permission that failed was:
       System.Security.PermissionSet
       The demand was for:
       <PermissionSet class="System.Security.PermissionSet"
       version="1"
       Unrestricted="true"/>

       The granted set of the failing assembly was:
       <PermissionSet class="System.Security.PermissionSet"
       version="1">
       <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Read="USERNAME"/>
       <IPermission class="System.Security.Permissions.FileDialogPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Unrestricted="true"/>
       <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Read="Q:\MyApp\"
       PathDiscovery="Q:\MyApp\"/>
       <IPermission class="System.Security.Permissions.IsolatedStorageFilePermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Allowed="AssemblyIsolationByUser"
       UserQuota="9223372036854775807"
       Expiry="9223372036854775807"
       Permanent="True"/>
       <IPermission class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Flags="ReflectionEmit"/>
       <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Flags="Assertion, Execution, BindingRedirects"/>
       <IPermission class="System.Security.Permissions.UIPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Unrestricted="true"/>
       <IPermission class="System.Security.Permissions.UrlIdentityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Url="file:///Q:/MyApp/Version.exe"/>
       <IPermission class="System.Security.Permissions.ZoneIdentityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Zone="Intranet"/>
       <IPermission class="System.Net.DnsPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       version="1"
       Unrestricted="true"/>
       <IPermission class="System.Drawing.Printing.PrintingPermission, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
       version="1"
       Level="DefaultPrinting"/>
       </PermissionSet>

       The assembly or AppDomain that failed was:
       Version, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
       The Zone of the assembly that failed was:
       Intranet
       The Url of the assembly that failed was:
       file:///Q:/MyApp/Version.exe

【问题讨论】:

    标签: c# .net security code-access-security


    【解决方案1】:

    您使用的是哪个版本的框架?旧版本不太信任网络共享 - 因此您可能需要使用“caspol”来启用信任(或在运行文件之前将文件移动到本地)。最近,框架确实信任 ma​​pped 共享(例如 Q:\),但不信任没有“caspol”调整的 UNC 共享(\\someserver\whatever)。

    不过,最简单的选择是从本地驱动器而不是通过网络运行 exe。

    【讨论】:

    • 我使用的是 2.0。映射 Q: 后,我可以针对 Q:\Whatever\MyApp.exe 运行托管应用程序(从命令行以交互方式)。
    • 在托管应用程序中,我使用的是Assembly.LoadFile。我想我应该使用 Assembly.ReflectionOnlyLoadFrom 但这可能是问题(其中一个依赖项的 CAS)?
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2015-04-25
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多