Рекомендации по частичному уровню доверию
В этом разделе описываются рекомендации по использованию Windows Communication Foundation (WCF) в среде с частичным доверием.
Сериализация
При использовании DataContractSerializer в частично доверенном приложении следуйте указанным ниже рекомендациям.
Все сериализуемые типы должны быть явно отмечены атрибутом
[DataContract]
. В среде с частичным доверием следующие методы не поддерживаются:маркирование сериализуемых классов атрибутом SerializableAttribute;
реализация интерфейса ISerializable, чтобы класс мог управлять своим процессом сериализации.
Использование DataContractSerializer
Все типы, отмеченные атрибутом
[DataContract]
, должны быть открытыми. Сериализация неоткрытых типов в среде с частичным доверием невозможна.Все члены
[DataContract]
в сериализуемом типе[DataContract]
должны быть открытыми. Сериализация типа с неоткрытым членом[DataMember]
в среде с частичным доверием невозможна.Методы, обрабатывающие события сериализации (например,
OnSerializing
,OnSerialized
,OnDeserializing
иOnDeserialized
) должны быть объявлены как открытые. Однако поддерживаются явные и неявные реализации OnDeserialization.Типы
[DataContract]
, реализованные в сборках, отмеченных атрибутом AllowPartiallyTrustedCallersAttribute, не должны выполнять в конструкторе типа действия, связанные с безопасностью, так как DataContractSerializer не вызывает конструктор вновь созданного объекта во время десериализации. В частности, для типов[DataContract]
следует избегать использования указанных ниже общих методов обеспечения безопасности:попытка ограничить доступ с частичным доверием, делая конструктор типа внутренним или закрытым;
ограничение доступа к типу путем добавления
[LinkDemand]
в конструктор типа;предположение об успешном прохождении любых принудительно выполняемых конструктором проверок правильности в случае успешного создания объекта.
Использование IXmlSerializable
Ниже приведены рекомендации для типов, которые реализуют интерфейс IXmlSerializable и сериализуются с помощью DataContractSerializer.
Реализации статического метода GetSchema должны быть public.
Методы экземпляров, которые реализуют интерфейс IXmlSerializable, должны быть public.
Использование WCF из кода полностью доверенной платформы, который разрешает вызовы от частично доверенных вызывающих
В модели безопасности с частичным доверием системы WCF предполагается, что любой вызывающий открытого метода или свойства WCF работает в контексте управления доступом для кода ведущего приложения. WCF также предполагает, что для каждого домена AppDomain существует только один контекст безопасности приложения, который устанавливается во время создания домена AppDomain доверенным основным приложением (например, вызовом метода CreateDomain или диспетчером приложений ASP.NET).
Эта модель безопасности применяется для написанных пользователем приложений, которые не могут утвердить дополнительные разрешения на управление доступом для кода. Примером такого приложения является пользовательский код, выполняющийся в приложении ASP.NET со средним уровнем доверия. Однако в коде полностью доверенной платформы (например, в сторонней сборке, установленной в глобальном кэше сборок и принимающей вызовы от частично доверенного кода) должны быть приняты меры предосторожности в отношении обращения к WCF от имени частично доверенного приложения во избежание ввода уязвимых с точки зрения безопасности мест на уровне приложения.
В коде с полным доверием следует избегать изменения набора разрешений текущего потока на управление доступом для кода (путем вызова Assert, PermitOnly или Deny) до вызова интерфейсов API WCF от имени частично доверенного кода. Утверждение, отклонение или создание контекста разрешений потока, который не зависит от контекста безопасности уровня приложения, может привести к непредвиденному поведению. В зависимости от приложения такое поведение может стать причиной появления уязвимых с точки зрения безопасности мест на уровне приложения.
Код, который обращается в WCF, используя контекст разрешений потока, должен быть подготовлен к обработке указанных ниже ситуаций, которые могут возникать.
Контекст безопасности потока может не поддерживаться в ходе выполнения операции, что приводит к потенциальным исключениям, связанным с безопасностью.
Внутренний код WCF, а также любые предусмотренные пользователем обратные вызовы могут выполняться в контексте безопасности, отличном от контекста, в котором был первоначально инициирован вызов. К таким контекстам относятся следующие.
Контекст разрешений приложения.
Любой контекст разрешений потока, созданный ранее другими пользовательскими потоками, используемыми для обращения в WCF в течение времени существования работающего в данный момент домена AppDomain.
Система WCF гарантирует невозможность получения частично доверенным кодом разрешений с полным доверием, если такие разрешения не утверждены полностью доверенным компонентом до обращения к открытым интерфейсам API WCF. Однако она не гарантирует, что результаты утверждения полного доверия изолируются для конкретного потока, операции или действия пользователя.
Рекомендуется избегать создания контекста разрешений потока посредством вызова Assert, PermitOnly или Deny. Вместо этого предоставьте привилегию самому приложению или отклоните ее, чтобы вызывать Assert, Deny или PermitOnly не требовалось.