0

好的,所以我有一个项目来创建一个 .Net 控件,该控件通过网页中的 COM 对象与客户端条形码扫描仪进行交互(只需要 IE)。为此,我们使用了一个 .Net Windows 窗体控件库 DLL,该 DLL 使用 Object 标签加载:

<object id="scannerCont" classid="http:ControlAssembly.dll#Controls.MyControl"/>

到目前为止,我已经让 .Net 控件在网页中呈现,但现在我遇到了麻烦,因为我无法让控件获得对其他 DLL 的访问权限。基本上,该控件调用一个非托管 DLL,该 DLL 提供对扫描仪单元的 COM 互操作访问。当我加载页面而不尝试访问 DLL 时,它加载得很好,但是当我尝试引用它时,我在临时 Internet 文件文件夹中收到 FusionBindErrors。

错误如下:

*****   IEHOST Error Log (Friday, 12 October 2012 09:27)    *****



URL:        http://scanner:8014/scanner/ControlAssembly.dll
Zone:       2
Assembly Name:  ControlAssembly.dll
Type Name:  Controls.MyControl



----- Thrown Exception -----


System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileLoadException: Could not load file or assembly 'ActiveScanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)
File name: 'ActiveScanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.Security.Policy.PolicyException: Required permissions cannot be acquired.
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission)
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Int32& securitySpecialFlags, Boolean checkExecutionPermission)
   at Controls.MyControl..ctor()
   --- End of inner exception stack trace ---
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
   at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateComInstanceFrom(String assemblyName, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   at System.AppDomain.CreateComInstanceFrom(String assemblyFile, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   at System.AppDomain.CreateComInstanceFrom(String assemblyFile, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   at Microsoft.IE.SecureFactory.CreateInstanceWithSecurity2(Int32 dwFlags, Int32 dwZone, String wszSite, String wszId, String wszConfig, String wszLicenses, String wszDeploymentManifest)

现在,据我了解,这是由于权限问题造成的错误。在你们回应说将网页添加到受信任的站点列表之前,这不是一个选项。这是一个面向客户的组件,我们最多只能将他们提交给接收安全警告消息,他们可以单击该消息以允许控制提升的权限。

我一直试图找到解决这个问题的方法,但似乎这不是一种广泛采用的做法,因此关于如何缓解此错误的文档很少。

我想注意的是,如果我从加载控件的网站文件夹中删除无关的 DLL,我会收到一个 File Not Found FusionBindError,这意味着一旦我解决了这个权限,系统应该能够加载这个无关的 DLL问题...

有人有授予此权限的经验吗?同样,我们对最终用户从 .Net 获得弹出窗口要求他们授予此权限的权限感到满意,但我们不能要求最终用户将我们的站点添加到受信任区域。

我想知道我是否可以在对象标记中添加一些信息来说明它也需要这个其他 DLL?

4

1 回答 1

1

如您所见,托管在 IE 中的 .NET 控件在具有受限权限的“沙盒”中运行。对于 .NET 2.0 / 3.0 / 3.5,调整权限的唯一方法是修改客户端计算机上的代码访问安全 (CAS) 策略。我无法从错误消息中看出所需的特定权限,但我猜 ActiveScanner.dll 要求“FullTrust”(因为它必须与 COM 互操作)——并且 Internet Explorer 中没有授予完全信任的区域默认。

在 .NET 4.0+ 中,沙盒模型发生了变化(它使用代码中的属性——SecurityCrtical、SecurityTransparent 等);我没有使用过 .NET 4.0,但我再次认为 Internet Explorer 不会授予您“完全信任”您的控制权。

总结一下:我不知道你可以在网页/对象标签上做任何事情来请求额外的权限。IE 根本不会在不修改客户端 PC 上的某些内容的情况下授予完全信任权限。

于 2012-12-07T17:07:30.510 回答