Декларативная безопасность методов в .NET 3.5 - как заблокировать разрешения метода? - PullRequest
2 голосов
/ 11 марта 2010

Я использую .NET 3.5. Скажем, у меня есть метод, который обращается к определенному файлу и определенному разделу реестра. Я хочу добавить декларативные определения безопасности, которые ограничивают метод, чтобы он мог обращаться только к файлу и указанному разделу реестра, и ничего больше.

Когда я пытаюсь:

    [RegistryPermission(SecurityAction.PermitOnly, Read = "registry key path"]
    [FileIOPermission(SecurityAction.PermitOnly, Read = "file path")]

... это позволяет мне прочитать путь к файлу, но не раздел реестра - я получаю исключение безопасности.

Если я использую:

    [RegistryPermission(SecurityAction.Demand, Read = "registry key path"]
    [FileIOPermission(SecurityAction.Demand, Read = "file path")]

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

Я что-то упускаю из-за того, как использовать эти методы для достижения этого эффекта?

Edit:

Код, который я использую для доступа к разделу реестра:

    RegistryKey rk = Registry.LocalMachine;
    rk = rk.OpenSubKey("MyKey");
    string registryVal = rk.GetValue("Test").ToString();

и, следовательно, декларация разрешения:

[RegistryPermission(SecurityAction.PermitOnly, Read = @"HKEY_LOCAL_MACHINE\MyKey")]

Спасибо.

1 Ответ

1 голос
/ 11 марта 2010

Я думаю, что SecurityAction.Demand создает исключение безопасности, если ваша текущая цепочка вызовов еще не имеет указанного доступа. Он не меняет доступ, который у вас есть (поэтому он не ограничивает доступ к другим файлам, которые вы можете записать), но вы должны увидеть исключение безопасности, если у вас нет доступа к указанному пути.

Исходя из того, что вы укажете, PermitOnly будет правильным значением для использования (оно ограничивает доступ только к указанному вами элементу), и поэтому я задаюсь вопросом, в чем заключается проблема с кодом ключа реестра. Типичным примером является то, что классы реестра .NET можно использовать для открытия ключа как «только для чтения» или «для чтения-записи» - и если вы попытаетесь открыть чтение-запись, вы получите исключение безопасности, даже если вы никогда не пытайтесь изменить значение.

Можете ли вы опубликовать код для доступа к реестру?

...