Подтвердить что ты не робот

Попытка прозрачным методом безопасности X для доступа к критически важному критическому методу Y не удалось

У меня довольно стабильная версия серверного приложения, которая уже почти год работает с десятками клиентов.

Один новый клиент недавно настроил приложение и получает следующую ошибку:

System.MethodAccessException: попытка с помощью прозрачного метода безопасности [SomeMethod] для доступа к критическому критическому методу [SomeOtherMethod] не удалось.

SomeMethod и SomeOtherMethod - это методы в сборках, которые я написал, которые построены на .NET 4 и работают в службе Windows. Если это имеет значение, SomeOtherMethod ссылается на тип из сторонней сборки (EntLib 4.1), встроенной в .NET 2.0. Посмотрев код для EntLib 4.1, я вижу, что они используют атрибуты SecurityTransparent и APTC, но это никогда не вызывало проблем у других клиентов.

Эти сборки были обновлены из .NET 2.0 CLR, но давно. Этот точный код работает на других клиентах очень хорошо, и я не использую явно атрибут APTC, и я не использую атрибут SecurityCritical где угодно.

Это приводит меня к выводу, что проблема с конфигурацией или, возможно, с пакетом обновления .NET Framework. Был ли выпущен патч для .NET, который может вызвать это нарушение? Существует ли какой-либо параметр конфигурации, где это принудительно проверяет этот тип проверки, который отключен по умолчанию, но что мой клиент может включить?

Последняя точка. В моем сервисе используются RDLC SSRS для создания PDF файлов. Из-за некоторых изменений в .NET 4 я должен заставить службу использовать устаревшую политику безопасности через следующую конфигурацию:

  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true" />
  </runtime>

Подробнее о том, зачем мне это нужно, см. эту статью в статье stackoverflow: Очень высокое использование памяти в .NET 4.0

Важным моментом является то, что я делаю это и у других моих клиентов. Только у этого клиента возникают проблемы.

4b9b3361

Ответ 1

Вздох, шаблоны и методы, применяемые командой Microsoft Patterns and Practices, отвечающей за корпоративные библиотеки, довольно прискорбны. Ну, исключение точно, вы не можете назвать метод, который был оформлен как "я обязательно проверю безопасность" из кода, который был украшен "Meh, я не буду проверять безопасность, поэтому не беспокойтесь, записывая циклы процессора, чтобы проверить это", Какие масштабы, а также спецификации исключений, используемые в Java. CAS невероятно полезен, но диагностика исключений является основной головной болью и часто связана с кодом, который у вас нет, и не может исправить. Большая причина, по которой она устарела в .NET 4.

Редакция сделана. Принимая во внимание проблему, вам нужно выяснить, почему здесь применяется CAS. Простейшим объяснением этого является то, что служба не работает в полном доверии. Простейшим объяснением этого является то, что клиент не установил службу на локальный жесткий диск. Или, как правило, работает код не в режиме доверия, даже в локальных сборках, очень параноидальный администратор вполне может это предпочесть. Это нужно настроить с помощью Caspol.exe, инструмента, параметры командной строки которого таинственны как CAS. Пот-стрельба в объяснении с ненадежным местоположением, вашему клиенту необходимо запустить Caspol, как показано в этом блоге. Или просто просто разверните службу локально, чтобы применить по умолчанию "Я доверяю тебе".

Редактирование по реальной причине, обнаруженное OP: остерегайтесь альтернативного потока данных , который добавляется в файл при его загрузке из ненадежное подключение к Интернету или сети. Файл получит поток с именем "Zone.Identifier", который отслеживает, откуда он пришел, с помощью значения "ZoneId". Это значение, которое переопределяет доверие, полученное из места хранения. Обычно он помещается в зону Интернета. Используйте проводник, щелкните правой кнопкой мыши файл и нажмите "Разблокировать", чтобы удалить этот поток. После того, как вы уверены, что можете доверять файлу:)

Ответ 2

В случае, если это поможет другим пользователям опубликовать мое решение по этой проблеме:

1) На AssemblyInfo.cs удалена/прокомментирована строка [assembly: SecurityTransparent].

2) Класс и метод, выполняющий фактическое задание, были отмечены как [SecuritySafeCritical], в моем случае установление сетевого подключения:

[SecuritySafeCritical]
public class NetworkConnection : IDisposable
{
    [SecuritySafeCritical]
    public NetworkConnection(string networkName, NetworkCredential credentials)
    {
        .............
    }
}

3) Класс и метод Caller были рыночными как [SecurityCritical]:

[SecurityCritical]
public class DBF_DAO : AbstractDAO
{
    [SecurityCritical]
    public bool DBF_EsAccesoExclusivo(string pTabla, ref ArrayList exepciones)
    {
        ....
        using (new NetworkConnection(DBF_PATH, readCredentials))
        {
            ....
        }
    }
}

Ответ 3

Я столкнулся с подобной проблемой при запуске загруженного образца WCF из http://www.idesign.net/ при использовании их библиотеки ServiceModelEx. Я прокомментировал приведенную ниже строку в AssemblyInfo.cs в проекте ServiceModelEx

//[assembly: AllowPartiallyTrustedCallers]

и это сработало для меня.

Ответ 4

В моем случае это была проблема, когда я управлял пакетами NuGet в решении. Некоторые пакеты переопределяют привязку сборки сборки System.Web.Mvc в главном проекте веб-сайта. Установите значение 4.0.0.0 (я установил 5.0). Я не изменил уведомление об изменении, потому что Mvc v4.0 был установлен и доступен через GAC. Отложить назад