Иногда приложения asp.net, которые мы пишем, запускаются на виртуальных хостах. Некоторые виртуальные хосты могут установить разрешения для asp.net из соображений безопасности, что приведет к сбою в правильной работе наших приложений.
Симптомы проблемы:
По какой-то причине asp.net не может загрузить некоторые файлы DLL, и появляется следующее сообщение об ошибке: Ошибка сервера в приложении «/».
---------------------------------------------
Невозможно получить необходимые разрешения .
Описание. Во время выполнения текущего веб-запроса произошло необработанное исключение. Просмотрите трассировку стека, чтобы получить дополнительную информацию об ошибке и ее источнике.
Подробности об исключении: System.Security.Policy.PolicyException: необходимые разрешения невозможно получить. .
Ошибка источника:
во время выполнения текущего веб-запроса было создано необработанное исключение. Информацию о происхождении и местоположении исключения можно определить с помощью трассировки стека исключений ниже
:
[PolicyException: необходимые разрешения невозможно получить.]
System.Security.SecurityManager.ResolvePolicy(Доказательства, PermissionSet reqdPset, PermissionSet optPset, PermissionSet DenyPset, PermissionSet& Denied, логическая проверкаExecutionPermission) +2738293
System.Security.SecurityManager.ResolvePolicy(Доказательства, PermissionSet reqdPset, PermissionSet optPset, PermissionSet DenyPset, PermissionSet& Denied, Int32& SecuritySpecialFlags, Boolean checkExecutionPermission) +57
[FileLoadException: Не удалось загрузить файл или сборку 'Microsoft.Practices.ObjectBuilder, Версия = 1.0 .51205.0, Culture=neutral, PublicKeyToken=null' или одна из его зависимостей. Не удалось предоставить минимальные запросы разрешений (исключение из HRESULT: 0x80131417)].
System.Reflection.Assembly.nLoad(имя_сборки имя_файла, строка codeBase, доказательство сборкиSecurity, расположение сборкиHint, StackCrawlMark& stackMark, логическое значение throwOnFileNotFound, логическое значение для интроспекции) +0
System.Reflection.Assembly.InternalLoad(AssemblyName сборкаRef, Evidence сборкиSecurity, StackCrawlMark& stackMark, логическое значение для интроспекции) +211
System.Reflection.Assembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +141
System.Reflection.Assembly.Load(String AssemblyString) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String AssemblyName, Boolean starDirective) +32
Анализ проблемы:
По моему наблюдению, dll, созданная непосредственно приложением asp.net, может быть загружена нормально, и внешняя dll, непосредственно вызываемая asp.net, также может быть загружена нормально, но другие внешние dll, на которые ссылается только внешняя dll, не могут быть загружены. загружен. Я предполагаю: поскольку разрешения являются неполными, библиотеки DLL, созданные самим приложением asp.net, и библиотеки DLL, на которые напрямую ссылаются, могут получать разрешения посредством наследования разрешений, в то время как другие внешние библиотеки DLL, на которые ссылаются только внешние библиотеки DLL, не могут наследовать разрешения из-за ограничений разрешений. так что есть проблема недостаточности разрешений.
Решение проблемы:
В ходе экспериментов на моем компьютере было высказано предположение, что настройки корневого файла web.config (на моем компьютере его расположение — C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG) были изменены на виртуальном хосте.
Раздел настроек разрешений web.config по умолчанию выглядит следующим образом:
<locationallowOverride="true">
<система.веб>
<Политика безопасности>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</securityPolicy>
<trust level="Полный" originUrl="" />
</система.веб>
</местоположение>
Предположительно измененные настройки виртуального хоста: <locationallowOverride="false">
<система.веб>
<Политика безопасности>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</securityPolicy>
<уровень доверия="Высокий" originUrl="" />
</система.веб>
</location> Сначала он устанавливает для параметраallowOverride значение false, что предотвращает возможность переопределения разрешений в файле web.config пользователя. Затем он определил уровень доверия как «Высокий» вместо «Полного» по умолчанию. После моего тестирования, пока уровень доверия не является полным, другие внешние библиотеки DLL, на которые ссылается только внешняя библиотека DLL, не могут быть загружены. Поэтому рекомендую в техподдержке установить для разделаallowOverride значение true. Таким образом, я могу повторно указать разрешения в web.config.
Пример: <trust level="Full" originUrl="" />
Я в последнее время не изучал aps.net, поэтому не стал внимательно искать основные причины. Возможно, мое понимание неверно. Я надеюсь, что эксперт сможет объяснить мне основные причины или исправить мои ошибки.