Управление доступом к коду - Понимание того, почему SecurityTransparent может вызывать SecurityCritical

Я исследую безопасность доступа к коду. Требуется некоторое усилие, чтобы разобраться, поэтому я подумал, что наконец-то использую Reflector и начну исследовать, как .NET 4.0 использует атрибуты безопасности.

Наблюдения

Метод System.IO.File.Deleteукрашен атрибутом [SecuritySafeCritical].

Метод System.IO.File.Deleteделегирует внутренний метод InternalDelete, который украшен атрибутом [SecurityCritical].

У меня есть метод в одном из классов приложения MVC с именем DeleteFile, который выполняется как SecurityTransparent(который я проверил, проверив Свойство MethodInfo.IsSecurityCritical DeleteFile

Разрешения

Исходя из моего текущего понимания, это означало бы, что:

  1. System.IO.File.Delete может вызывать InternalDelete, потому что [SecuritySafeCritical]методы могут вызывать [SecurityCritical], поэтому исключение SecurityException не создается.
  2. DeleteFileможет вызывать System.IO.File.Delete, потому что [SecurityTransparent]может вызывать [SecuritySafeCritical]

Таким образом, в основном, без настройки каких-либо готовых настроек безопасности, этот код успешно удалит фиктивный файл с именем test.txt

namespace MyTestMvcApp
{
    public class FileHelpers()
    {
        // Has SecurityTransparent
        public void DeleteFile()
        {
            // Will succesfully delete the file
            File.Delete("test.txt");
        }
    }
}

Confusion

Внутри метода InternalDeleteSystem.IO.File.Delete, он использует метод CodeAccessPermission.Demandдля проверки того, что все вызывающие стек имеют метод необходимые разрешения. Что я не совсем понимаю, так это эту строку в документах MSDN CodeAccessPermission.Demand:

Разрешения кода, вызывающего этот метод, не проверяются; проверка начинается с непосредственного вызывающего этого кода и продолжается вверх по стеку.

Итак, мой вопрос заключается в том, что если методом DeleteFileмоего приложения является SecurityTransparent, почему разрешено вызывать метод SecurityCritical?

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

Спасибо

6
задан Chris 11 May 2012 в 11:48
поделиться