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

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

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

4 ответов


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

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

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


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

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

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

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

3) вызывающий класс и Метод были рыночными как [SecurityCritical]:

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

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

//[assembly: AllowPartiallyTrustedCallers]

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


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