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