Уровни доверия, используемые при доступе к ресурсам
В этом разделе описывается порядок ограничения доступа к ресурсам различных типов, используемым инфраструктурой System.Transactions.
Предусмотрено три основных уровня доверия для инфраструктуры System.Transactions. Уровни доверия определяются на основе типов ресурсов, используемых инфраструктурой System.Transactions, и уровня доверия, который требуется для доступа к этим ресурсам. Ресурсами, к которым инфраструктура System.Transactions предоставляет доступ, являются системная память, ресурсы, общие для всего процесса, и ресурсы, общие для всей системы. Уровни:
AllowPartiallyTrustedCallers (APTCA) для приложений, использующих транзакции в одном домене приложения.
DistributedTransactionPermission (DTP) для приложений с использованием распределенных транзакций.
FullTrust - для устойчивых ресурсов, приложений управления конфигурацией и приложений взаимодействия с традиционными системами.
Примечание.
Не следует вызывать какие-либо интерфейсы зачисления с олицетворяемыми контекстами.
Уровни доверия
APTCA (частичное доверие)
Сборка System.Transactions может вызываться частично доверенным кодом, так как она помечена атрибутом AllowPartiallyTrustedCallers (APTCA). Этот атрибут по сути удаляет неявный LinkDemand набор разрешений FullTrust , который в противном случае автоматически помещается на каждый общедоступный метод в каждом типе. Однако для некоторых типов и элементов по-прежнему требуются разрешения более высокого уровня.
Атрибут APTCA позволяет приложениям использовать транзакции с частичным доверием в одном домене приложения. Это обеспечивает использование неповышаемых транзакций и зачислений неустойчивых ресурсов, которые можно применять для обработки ошибок. В качестве примера рассмотрим транзакционную хэш-таблицу и используемое ей приложение. Данные можно добавлять и удалять из хэш-таблицы в рамках одной транзакции. В случае последующего отката транзакции все произведенные в рамках транзакции изменения хэш-таблицы могут быть отменены.
Разрешение DistributedTransactionPermission (DTP)
При передаче управления транзакцией System.Transactions координатору MSDTC инфраструктура System.Transactions запрашивает разрешение DistributedTransactionPermission (DTP) для создания распределенной транзакции. Это означает, что коду, вызывающему передачу транзакции на следующий уровень иерархии (например, посредством сериализации или зачисления дополнительных устойчивых ресурсов), требуется предоставление разрешения DTP. Коду, который изначально создал транзакцию System.Transactions, не обязательно располагать данным разрешением.
FullTrust (полное доверие)
Этот уровень разрешений предназначен для ограничения приложений, записывающих данные в устойчивые ресурсы. В случае сбоя приложение должно быть способно восстановить связь с диспетчером транзакций для определения окончательного результата транзакции, чтобы обновить постоянные данные. Приложение такого типа называется диспетчером устойчивых ресурсов. Классическим примером такого приложения является SQL.
Для выполнения восстановления у этого приложения имеется способность постоянно потреблять системные ресурсы. Это необходимо, поскольку диспетчер ресурсов, выполняющий восстановление, должен вспомнить все зафиксированные транзакции, прежде чем он сможет подтвердить, что все участвующие в транзакции диспетчеры устойчивых ресурсов получили результат транзакции. Поэтому приложению данного типа требуется разрешение FullTrust, и его не следует запускать, если такой уровень доверия не предоставлен.
Дополнительные сведения о устойчивых зачислениях и восстановлении см. в разделах "Включение ресурсов в качестве участников транзакции " и "Выполнение восстановления ".
Приложениям, которые выполняют традиционные операции взаимодействия с COM+, также требуется разрешение FullTrust.
Ниже приведен список типов и элементов, которые не вызываются частично доверенным кодом, так как они украшены атрибутом безопасности FullTrust декларативным:
PermissionSetAttribute(SecurityAction.LinkDemand, Name := "FullTrust")
Для использования указанных выше типов или методов требуется только непосредственный вызывающий объект.