Вопрос о рабочей парадигме Code Access Security (CAS) - PullRequest
0 голосов
/ 04 октября 2010

Я написал следующий код для проверки CAS:

    [SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.Execution)]
    static void Main(string[] args)
    {
        Console.WriteLine("hello, world!");
    }

В конфигурации .NET 2.0 я использую строгое имя вышеприведенной сборки, чтобы создать группу кода и дать группе Nothing набор разрешений. Таким образом, сборка не запустилась, как ожидалось.

Но я заметил, что если я удалю следующий атрибут:

[SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.Execution)]

Программа все еще не запустилась. Так какой смысл в этой так называемой декларативной безопасности 1012 * с атрибутом?

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

Если я намеренно напишу код без императивной / декларативной безопасности и не предоставлю никаких доказательств для моей сборки, будет ли CAS слепым для применения какой-либо политики безопасности?

Или я неправильно понимаю, как предполагается использовать CAS?

Спасибо.

1 Ответ

1 голос
/ 04 октября 2010

Требование разрешения CAS приводит к проверке каждого кадра стека вызовов выше метода, выполняющего требование. Поскольку ваша сборка не запускает код для вызова метода Main, требование не оценивается ни по одному из ваших кодов.

Именно отказ в разрешении на выполнение с помощью политики приводит к тому, что сборка не может быть выполнена. Разрешение оценивается самим CLR, когда он запускает ваш код сборки. Нет необходимости добавлять свои собственные требования для разрешения.

Чтобы сделать шаг назад и посмотреть, как должны использоваться требования CAS (декларативные или обязательные), рассмотрим, что разрешения защищают доступ к ресурсам. Любой код, разрешающий доступ к ресурсу (например, файловой системе), который иначе не был бы доступен для управляемого кода, должен предоставлять разрешение (например, FileIOPermission), которое можно использовать для управления доступом к этому ресурсу. Код, разрешающий доступ к ресурсу, также отвечает за требования к этому разрешению перед тем, как разрешить доступ к ресурсу.

Большинству разработчиков, пишущих управляемый код, никогда не потребуется ни создавать разрешение CAS, ни явно запрашивать разрешение CAS, поскольку они обычно получают доступ к ресурсам, предоставляемым (и защищаемым) либо библиотекой базовых классов .NET, либо другой Microsoft. или сторонние библиотеки.

...