尝试通过安全透明方法X访问安全关键方法Y失败

RMD*_*RMD 21 security cas .net-4.0 code-access-security

我有一个相当稳定的服务器应用程序版本,已经在数十个客户中部署了将近一年.

一位新客户最近设置了该应用程序,并收到以下错误:

System.MethodAccessException:尝试通过安全透明方法[SomeMethod]访问安全性关键方法[SomeOtherMethod]失败.

SomeMethod和SomeOtherMethod都是我编写的程序集中的方法,这些方法是针对.NET 4构建的,并且是在Windows服务中运行的.如果它有所不同,SomeOtherMethod确实引用了针对.NET 2.0构建的第三方程序集(EntLib 4.1)中的类型.查看EntLib 4.1的代码,我确实看到它们同时使用SecurityTransparent和APTC属性,但这从未在其他客户端引起过问题.

这些程序集是从.NET 2.0 CLR升级的,但很久以前.这个确切的代码正好在其他客户上运行,我没有明确使用APTC属性,也没有在任何地方使用SecurityCritical属性.

这使我得出结论,这是一个配置问题或者.NET Framework补丁问题.是否有针对.NET发布的补丁会导致这种突破性变化?是否有一个配置设置在某些地方执行这种类型的检查,默认情况下是关闭但我的客户可能已启用?

最后一点.我的服务使用SSRS RDLC生成PDF.由于.NET 4中的一些更改,我必须通过以下配置强制服务使用旧版安全策略:

  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true" />
  </runtime>
Run Code Online (Sandbox Code Playgroud)

有关我需要执行此操作的详细信息,请参阅此stackoverflow帖子:.NET 4.0中的内存使用率非常高

重要的是,我也在所有其他客户那里做到这一点.只有这一个客户遇到问题.

Han*_*ant 22

叹息一下,负责企业库的Microsoft模式和实践团队所采用的模式和实践非常令人遗憾.好吧,异常是准确的,你不能调用一个方法,装饰为"我肯定会检查安全性"从代码装饰"Meh,我不会检查安全性所以不要费心烧cpu周期来检查它" .其中包括Java中使用的缩放以及异常规范.CAS非常有用,但诊断异常是一个令人头疼的问题,通常涉及您不拥有且无法修复的代码.它在.NET 4中被弃用的重要原因.

编辑完成.对这个问题进行一蹴而就,你需要找出CAS在这里被强制执行的原因.最简单的解释是该服务不能完全信任.对于最简单的解释是客户端没有本地硬盘驱动器上安装的服务.或者通常在不信任模式下运行代码,即使在本地程序集上也是如此,一个非常偏执的管理员可能更喜欢这样.这需要使用Caspol.exe进行配置,这是一个命令行选项与CAS一样神秘的工具.在不受信任的位置解释,您的客户需要运行Caspol,如本博客文章所示.或者只是简单地在本地部署服务,因此默认的"我信任你"适用.

根据OP发现的真实原因进行编辑:注意从不受信任的Internet或网络位置下载时添加到文件中的备用数据流.该文件将获得一个名为"Zone.Identifier"的流,该流使用"ZoneId"值跟踪它的来源.正是该值覆盖了从存储位置派生的信任.通常将其放入Internet区域.使用资源管理器,右键单击该文件,然后单击"取消阻止"以删除该流.在您确定可以信任该文件后:)

  • 你的回答非常有帮助.事实上,事实证明它是被封锁的组件.删除文件阻止(属性 - >取消阻止)解决了该问题. (3认同)
  • @RMD谢谢!该死的你Windows. (2认同)

小智 10

万一它帮助其他人我发布我的解决方案来解决这个问题:

1)在AssemblyInfo.cs上,删除/注释了[assembly:SecurityTransparent]行.

2)[SecuritySafeCritical]在建立网络连接的情况下,执行实际作业的类和方法被标记为:

[SecuritySafeCritical]
public class NetworkConnection : IDisposable
{
    [SecuritySafeCritical]
    public NetworkConnection(string networkName, NetworkCredential credentials)
    {
        .............
    }
}
Run Code Online (Sandbox Code Playgroud)

3)来电者等级和方法的市场为[SecurityCritical]:

[SecurityCritical]
public class DBF_DAO : AbstractDAO
{
    [SecurityCritical]
    public bool DBF_EsAccesoExclusivo(string pTabla, ref ArrayList exepciones)
    {
        ....
        using (new NetworkConnection(DBF_PATH, readCredentials))
        {
            ....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

我在使用ServiceModelEx库时从http://www.idesign.net/运行下载的WCF示例时遇到了类似的问题.我在ServiceModelEx项目的AssemblyInfo.cs中注释掉了以下行

//[assembly: AllowPartiallyTrustedCallers]
Run Code Online (Sandbox Code Playgroud)

它对我有用.