Сценарий
Скажем, у нас есть следующий код:
[SecuritySafeCritical]
public void SomeMethod()
{
SomeCriticalClass critical = new SomeCriticalClass();
Action someDelegate = () =>
{
critical.Do();
}
someDelegate();
}
- Подписи
SomeMethod
имеет атрибут[SecuritySafeCritical]
. -
SomeCriticalClass
- это некоторый класс, который имеет атрибут[SecurityCritical]
либо на уровне метода, либо на методеDo
. - Мы создаем анонимный делегат, автоматически определяемый
Action
.
Проблема
Вызов critical.Do()
вызывает MethodAccessException
FieldAccessException
, потому что прозрачный метод безопасности (анонимный метод) пытается получить доступ к критическому значению безопасности (локальная переменная critical
SomeCriticalClass).
Вопрос
Как вы преодолеваете это?
Простым способом будет использование фактического метода, помеченного [SecuritySafeCritical]
вместо использования анонимного делегата. Но это приводит нас к анонимным делегатам и эры lambas. Я не хочу этого.
Другим простым способом было бы просто не использовать прозрачность безопасности. Это не решение.
Почти все доступные библиотеки как из Microsoft, так и из сообщества с открытым исходным кодом не разработаны с учетом прозрачности безопасности. То есть любой собственный код должен взаимодействовать с сторонними библиотеками через [SecuritySafeCritical]
или [SecurityCritical]
методы/свойства/делегаты.
На самом деле я считаю, что прозрачность безопасности - хороший инструмент, потому что он создает лучшие и безопасные разработки программного обеспечения, критические действия очень локализованы, а остальная часть кода работает с минимальными разрешениями.