Связаться с нами: info@exonya.com или (+7 812) 982-2514

  • Русский
  • English

EXONYA
Разработка программ, веб-дизайн, продвижение (SEO, SMM)

Утверждение разрешений на C#

Автор EXONYA в . Опубликовано новости компании, Разработка программ

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

Утверждения в мире в мире CAS ничего не должны делать с утверждениями диагностики или контрактов. Вызов Debug.Assert на самом деле больше похож на вызов Demand для разрешения, чем на Assert для того же разрешения. В частности, утверждение разрешения имеет побочные эффекты, если утверждение завершается успешно, тогда как Debug.Assert — нет.

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

Первый шаг заключается в создании отдельной сборки для этого (например, utilities) и добавлении атрибута AllowPartiallyTrustedCallers. Затем метод можно открыть следующим образом:

public static void WriteLog (string msg)
{
// write a record to a journal
}

Сложность здесь состоит в том, что такая запись в файл требует разрешения FilelOPermission. Даже если наша сборка utilities будет иметь полное доверие, это не касается вызывающей сборки, поэтому любые требования файловых разрешений посредством Demand потерпят неудачу. Решение заключается в том, чтобы сначала вызвать Assert для этого разрешения:

public class Utils
{

string _logsFolder = . . .;

[SecuritySafeCritical]
public static void WriteLog (string msg)
{

FilelOPermission f = new FilelOPermission (PermissionState.None);
f.AddPathList (FilelOPermissionAccess.AllAccess, _logsFolder);
f. Assert();

// write a record to a journal
}

}

Поскольку мы выдаем утверждение разрешения, то должны пометить I метод как [SecurityCritical] или [SecuritySafeCritical] (если только сборка не ориентируется на раннюю версию .NET Framework).

В этом случае метод является безопасным для вызывающих сборок с частичным доверием, так что мы выбираем SecuritySafeCritical. Естественно, это означает, что мы не можем пометить всю сборку целиком как [SecurityTransparent].

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

Теги: , , , , , , ,

EXONYA

Software Development Company, Custom Software Development, Offshore Programming, Software Outsourcing