从部分受信任的代码调用非托管代码的正确方法

时间:2009-04-26 20:29:49

标签: .net security sharepoint com interop

通过.Net interop从部分受信任的环境中执行的代码调用非API(例如COM API)的非托管代码的正确方法是什么?

在为Microsoft SharePoint开发ASP.Net WebPart时,我必须通过其COM API与另一个系统进行通信。我通过将SharePoint的权限更改为完整来临时解决了此问题。后来我通过在最小设置之上实现自定义安全性来提高SharePoint UnmanagedCode权限,但这并没有那么大的改进,因为非托管代码可以跳过CAS的其余部分。

根据我的收集,我可能需要一个完全受信任的程序集,它允许部分信任的调用者,并充当托管和非托管域之间的层。此外,我认为需要一些额外的设置,允许部分受信任的代码调用完全受信任的代码,而完全受信任的代码不受部分受信任代码的许可。

那么正确的方法是什么以及如何在实践中实施它?

2 个答案:

答案 0 :(得分:3)

是的,您需要一个完全受信任的程序集,它允许部分信任的调用者,并充当托管和非托管域之间的层。

如果您编写的代码必须与部分受信任的代码交互或从部分受信任的上下文操作,则应考虑以下因素:

  • 必须使用强名称对库进行签名才能由多个应用程序共享。强名称允许您的代码放在全局程序集缓存中,并允许消费者验证特定的移动代码实际来自您。
  • 默认情况下,强名称共享库会自动执行隐式LinkDemand以获得完全信任,而不需要库编写者执行任何操作。
  • 如果调用者没有完全信任但仍尝试调用此类库,则运行时将抛出SecurityException,并且不允许调用者链接到库。
  • 为了禁用自动LinkDemand并防止抛出异常,可以将AllowPartiallyTrustedCallersAttribute属性放在共享库的程序集范围内。此属性允许从部分受信任的托管代码中调用库。
  • 被授予对具有此属性的库的访问权限的部分受信任的代码仍受本地计算机策略定义的进一步限制。
  • 部分受信任的代码没有编程方式来调用没有AllowPartiallyTrustedCallersAttribute属性的库。如果应用程序默认情况下未获得完全信任,则管理员必须选择修改安全策略并授予应用程序完全信任权,然后才能调用此类库。

来源: MSDN: Using Libraries from Partially Trusted Code

答案 1 :(得分:1)

调用的代码需要具有UnmanagedCode权限。那部分是不可避免的。问题是,您将如何获得具有UnmanagedCode权限的代码?不幸的是,我不太了解WebPart / SharePoint及其限制,无法帮助您。