Рекомендации по частичному доверию

В этой статье описаны рекомендации при запуске Windows Communication Foundation (WCF) в среде частичного доверия.

Сериализация

Примените эти методики при использовании DataContractSerializer частично доверенного приложения.

Все сериализуемые типы должны быть явно отмечены атрибутом [DataContract]. Следующие методы не поддерживаются в среде частичного доверия:

  • маркирование сериализуемых классов атрибутом SerializableAttribute;
  • реализация интерфейса ISerializable, чтобы класс мог управлять своим процессом сериализации.

Использование DataContractSerializer

  • Все типы, отмеченные атрибутом [DataContract], должны быть открытыми. Недоступные типы нельзя сериализовать в среде частичного доверия.

  • Все члены [DataContract] в сериализуемом типе [DataContract] должны быть открытыми. Тип с недоступной [DataMember] средой доверия нельзя сериализовать в среде частичного доверия.

  • Методы, обрабатывающие события сериализации (например, OnSerializing, OnSerialized, OnDeserializing и OnDeserialized) должны быть объявлены как открытые. Однако поддерживаются явные и неявные реализации OnDeserialization(Object).

  • [DataContract] типы, реализованные в сборках, помеченных как не должны выполнять действия, связанные с AllowPartiallyTrustedCallersAttribute безопасностью, в конструкторе типов, так как DataContractSerializer не вызывает конструктор только что созданного объекта во время десериализации. В частности, для типов [DataContract] следует избегать использования указанных ниже общих методов обеспечения безопасности:

  • попытка ограничить доступ с частичным доверием, делая конструктор типа внутренним или закрытым;

  • ограничение доступа к типу путем добавления [LinkDemand] в конструктор типа;

  • предположение об успешном прохождении любых принудительно выполняемых конструктором проверок правильности в случае успешного создания объекта.

Использование IXmlSerializable

Ниже приведены рекомендации для типов, которые реализуют интерфейс IXmlSerializable и сериализуются с помощью DataContractSerializer.

  • Реализации статического метода GetSchema должны быть public.

  • Методы экземпляров, которые реализуют интерфейс IXmlSerializable, должны быть public.

Использование WCF из полностью доверенного кода платформы, разрешающего вызовы от частично доверенных вызывающих абонентов

Модель безопасности частичного доверия WCF предполагает, что любой вызывающий общедоступный метод ИЛИ свойство WCF выполняется в контексте безопасности доступа к коду (CAS) приложения размещения. WCF также предполагает, что для каждого из них AppDomainсуществует только один контекст безопасности приложений, и что этот контекст устанавливается во AppDomain время создания доверенным узлом (например, вызовом CreateDomain или диспетчером приложений ASP.NET).

Примечание.

Безопасность доступа к коду (CAS) устарела во всех версиях платформа .NET Framework и .NET. Последние версии .NET не учитывают заметки CAS и создают ошибки, если используются API, связанные с CAS. Разработчики должны искать альтернативные средства выполнения задач безопасности.

Эта модель безопасности применяется к приложениям, написанным пользователем, которые не могут утверждать дополнительные разрешения CAS, такие как код пользователя, работающий в приложении среднего доверия ASP.NET. Однако полностью доверенный код платформы (например, сторонние сборки, установленные в глобальном кэше сборок и принимающие вызовы из частично доверенного кода), должны выполнять явные действия при вызове WCF от имени частично доверенного приложения, чтобы избежать уязвимостей безопасности на уровне приложений.

Код полного доверия должен избегать изменения набора разрешений CAS текущего потока (вызывая AssertPermitOnlyилиDeny) перед вызовом API WCF от имени частично доверенного кода. Утверждение, отклонение или создание контекста разрешений потока, который не зависит от контекста безопасности уровня приложения, может привести к непредвиденному поведению. В зависимости от приложения такое поведение может стать причиной появления уязвимых с точки зрения безопасности мест на уровне приложения.

Код, вызывающий WCF с помощью контекста разрешений для конкретного потока, должен быть подготовлен для обработки следующих ситуаций, которые могут возникнуть:

  • Контекст безопасности потока может не поддерживаться в ходе выполнения операции, что приводит к потенциальным исключениям, связанным с безопасностью.

  • Внутренний код WCF и любые обратные вызовы, предоставляемые пользователем, могут выполняться в другом контексте безопасности, отличном от того, под которым изначально был инициирован вызов. К таким контекстам относятся следующие.

    • Контекст разрешений приложения.

    • Любой контекст разрешений для конкретного потока, ранее созданный другими потоками пользователей, используемый для вызова в WCF во время существования запущенного AppDomainв данный момент времени.

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

Рекомендуется избегать создания контекста разрешений потока посредством вызова Assert, PermitOnly или Deny. Вместо этого предоставьте привилегию самому приложению или отклоните ее, чтобы вызывать Assert, Deny или PermitOnly не требовалось.

См. также