私たちが作成した asp.net アプリケーションは、仮想ホスト上で実行されることがあります。一部の仮想ホストでは、セキュリティを考慮して asp.net にアクセス許可が設定されている場合があり、これによりアプリケーションが適切に実行できなくなります。
問題の症状:
何らかの理由で、asp.net は一部の dll ファイルを読み込むことができず、次のエラー メッセージが表示されます: '/' アプリケーションのサーバー エラー。
---------------------------------------
必要な権限を取得できません。
説明: 現在の Web リクエストの実行中にハンドルされない例外が発生しました。エラーの詳細とコードの発生場所については、スタック トレースを確認してください。
例外の詳細: System.Security.Policy.PolicyException: 必要なアクセス許可を取得できません。
ソース エラー:
現在
の Web リクエストの実行中にハンドルされない例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます
。
[PolicyException: 必要な権限を取得できません。]
System.Security.SecurityManager.ResolvePolicy(証拠証拠、PermissionSet reqdPset、PermissionSet optPset、PermissionSet拒否Pset、PermissionSet&拒否、ブール値checkExecutionPermission) +2738293
System.Security.SecurityManager.ResolvePolicy(証拠証拠、PermissionSet reqdPset、PermissionSet optPset、PermissionSet DenyPset、PermissionSet& 拒否、Int32& securitySpecialFlags、Boolean checkExecutionPermission) +57
[FileLoadException: ファイルまたはアセンブリ 'Microsoft.Practices.ObjectBuilder、Version=1.0 を読み込めませんでした。 .51205.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つが失敗しました (HRESULT からの例外: 0x80131417)。
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence AssemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.InternalLoad(AssemblyName AssemblyRef、Evidence AssemblySecurity、StackCrawlMark& stackMark、Boolean forIntrospection) +211
System.Reflection.Assembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +141
System.Reflection.Assembly.Load(文字列アセンブリ文字列) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String AssemblyName, Boolean starDirective) +32
問題分析:
私の観察によると、asp.netアプリケーションによって直接生成されたdllは正常にロードでき、asp.netによって直接呼び出された外部dllも正常にロードできますが、外部dllによってのみ参照される他の外部dllはロードできません。ロードされています。私の推測では、アクセス許可が不完全であるため、asp.net アプリケーション自体によって生成された DLL と直接参照される DLL はアクセス許可の継承を通じてアクセス許可を取得できますが、外部 DLL によってのみ参照される他の外部 DLL はアクセス許可の制限によりアクセス許可を継承できません。したがって、権限が不十分であるという問題が発生します。
問題解決:
私のコンピューターでの実験により、ルート web.config (私のコンピューターではその場所は C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG) の設定が仮想ホスト上で変更されたと推測されます。
デフォルトの web.config 権限設定セクションは次のとおりです。
<locationallowOverride="true">
<システム.ウェブ>
<セキュリティポリシー>
<trustLevel name="完全" ポリシーファイル="内部" />
<trustLevel name="High" ポリシーファイル="web_hightrust.config" />
<trustLevel name="Medium" ポリシーファイル="web_mediumtrust.config" />
<trustLevel name="Low" ポリシーファイル="web_lowtrust.config" />
<trustLevel name="Minimal"policyFile="web_minimaltrust.config" />
</セキュリティポリシー>
<trust level="Full" OriginUrl="" />
</system.web>
</場所>
おそらく、仮想ホストの設定が変更されています: <locationallowOverride="false">
<システム.ウェブ>
<セキュリティポリシー>
<trustLevel name="完全" ポリシーファイル="内部" />
<trustLevel name="High" ポリシーファイル="web_hightrust.config" />
<trustLevel name="Medium" ポリシーファイル="web_mediumtrust.config" />
<trustLevel name="Low" ポリシーファイル="web_lowtrust.config" />
<trustLevel name="Minimal"policyFile="web_minimaltrust.config" />
</セキュリティポリシー>
<信頼レベル="高" OriginUrl="" />
</system.web>
</location> まず、allowOverride を false に設定します。これにより、ユーザーの web.config でアクセス許可を再定義できなくなります。次に、信頼レベルをデフォルトの「完全」ではなく「高」として定義しました。テストした結果、信頼レベルがフルでない限り、外部 DLL によってのみ参照される他の外部 DLL はロードできません。 したがって、テクニカル サポートは、allowOverride セクションを true に設定することをお勧めします。このようにして、web.config で権限を再指定できます。
例: <trust level="Full" OriginUrl="" />
最近 aps.net を勉強していないので、根本的な理由を詳しく調べていないのですが、もしかしたら私の理解が間違っているかもしれません。専門家が根本的な理由を教えてくれるか、私の間違いを修正してくれることを願っています。