0

さて、Web ページから COM オブジェクトを介してクライアントのバーコード スキャナーと対話する .Net コントロールを作成するプロジェクトがあります (IE のみが必要です)。これを行うために、Object タグを使用してロードされる .Net Windows フォーム コントロール ライブラリ DLL を利用しました。

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

これまでのところ、Web ページでレンダリングする .Net コントロールを取得しましたが、追加の DLL にアクセスするためのコントロールを取得できないため、問題が発生しています。基本的に、コントロールは、スキャナー ユニットへの COM 相互運用アクセスを提供するアンマネージ DLL を呼び出します。DLL にアクセスせずにページを読み込むと問題なく読み込まれますが、参照しようとすると一時インターネット ファイル フォルダに 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)

今、エラーを理解しているので、それは権限の問題が原因です。Web ページを信頼済みサイト リストに追加するように応答する前に、これはオプションではありません。これは顧客向けのコンポーネントであり、せいぜい、昇格されたアクセス許可の制御を許可するためにクリックできるセキュリティ警告メッセージを受け取るように送信することしかできません。

私はこれに対する解決策を見つけようとしてきましたが、これが広く採用されている方法ではないようで、このエラーを軽減する方法に関するドキュメントはほとんどありません。

ただし、コントロールのロード元の Web サイト フォルダから余分な DLL を削除すると、File Not Found FusionBindError が返されます。これは、このアクセス許可を解決すると、システムがこの無関係な DLL をロードできるはずであることを意味します。問題...

誰でもこの許可を付与した経験がありますか? 繰り返しますが、エンド ユーザーが .Net からこの権限を付与する許可を求めるポップアップを取得しても問題ありませんが、サイトをトラスト ゾーンに追加するようエンド ユーザーに求めることはできません。

object タグに情報を追加して、この他の 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 がユーザーのコントロールに「完全な信頼」を与えるとは思えません。

要約すると、追加の権限を要求するために Web ページ / object-tag でできることはわかりません。IE は、クライアント PC で何かを変更しない限り、完全な信頼のアクセス許可を付与しません。

于 2012-12-07T17:07:30.510 に答える