Show / Hide Table of Contents

Безопасность частичного доверия в WPF

Как правило, интернет-приложениям следует ограничить прямой доступ к критическим системным ресурсам, чтобы избежать злонамеренного повреждения. По умолчанию HTML и языки сценариев на стороне клиента не могут получить доступ к критическим системным ресурсам. Поскольку Браузерные приложения Windows Presentation Foundation (WPF) может быть запущено из браузера, они должны соответствовать аналогичному набору ограничений. Для принудительного применения этих ограничений WPF полагается на CAS (Code Access Security — безопасность доступа кода) и ClickOnce (см. в разделе стратегия безопасности WPF — безопасность платформы). По умолчанию Браузерные приложения запрашивают зоны Интернета CAS набор разрешений, независимо от того, запускаются ли они из Интернета, локальной интрасети или локального компьютера. Приложения, выполняющиеся с набором разрешений меньшим, чем полный набор, называют выполняющимися с частичным доверием.

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

В этом разделе содержатся следующие подразделы.

  • Поддержка частичного доверия функциями WPF

  • Программирование в режиме частичного доверия

  • Управление разрешениями

Поддержка частичного доверия функциями WPF

В следующей таблице перечислены обобщенные функции Windows Presentation Foundation (WPF), которые являются безопасными для использования в пределах набора разрешений зоны Интернета.

Таблица 1. Функции WPF, являются безопасными в режиме частичного доверия

Область функции Функция
Общие Окно обозревателя

Доступ к исходному сайту

IsolatedStorage (ограничение 512 КБ)

Поставщики UIAutomation

Система команд

Редакторы метода ввода (IME)

Перо планшетного компьютера и рукописный ввод

Моделирование перетаскивания с помощью событий захвата и перемещения мыши

OpenFileDialog

Десериализация XAML (посредством XamlReader.Load)
Веб-интеграция Диалоговое окно загрузки браузера

Навигация верхнего уровня, инициированная пользователем

mailto:links

Параметры универсального идентификатора ресурса (URI)

HTTPWebRequest

Содержимое WPF, размещенное в IFRAME

Размещение HTML-страниц одного веб-сайта с помощью Frame

Размещение HTML-страниц одного веб-сайта с помощью WebBrowser

Веб-службы (ASMX-файлы)

Веб-службы (с помощью Windows Communication Foundation)

Скрипты

Модель DOM
Визуальные элементы 2D- и 3D-графика

Анимация

Мультимедиа (исходный сайт и междоменные)

Обработка изображений/аудио/видео
Чтение FlowDocument

XPS-документы

Внедренные и системные шрифты

Шрифты CFF и TrueType
Редактирование Проверка орфографии

RichTextBox

Поддержка буфера обмена для обычного текста и рукописного ввода

Вставка, инициированная пользователем

Копирование выделенного содержимого
Элементы управления Общие элементы управления

Эта таблица охватывает WPF функции на высоком уровне. Более подробные сведения, Windows SDK задокументированы разрешения, необходимые каждому элементу в WPF. Кроме того, следующие функции содержат более подробные сведения, касающиеся выполнения при частичном доверии, включая некоторые особые аспекты.

  • XAML (см. в разделе Обзор XAML (WPF)).

  • Всплывающие окна (см. в разделе System.Windows.Controls.Primitives.Popup).

  • Перетаскивание (см. в разделе Drag and Drop Обзор).

  • Буфер обмена (см. в разделе System.Windows.Clipboard).

  • Работы с образами (см. в разделе System.Windows.Controls.Image).

  • Сериализация (см. в разделе XamlReader.Load, XamlWriter.Save).

  • Открыть файл-диалоговое окно (см. в разделе Microsoft.Win32.OpenFileDialog).

В следующей таблице описываются WPF набора разрешений зоны функции, которые не являются безопасными для выполнения в пределах Интернета.

Таблица 2. Функции WPF, не являются безопасными в режиме частичного доверия

Область функции Функция
Общие Окно (определенные приложением окна и диалоговые окна)

SaveFileDialog

Файловая система

Доступ к реестру

Перетаскивание

Сериализация XAML (через XamlWriter.Save)

Клиенты UIAutomation

Доступ к исходному окну (HwndHost)

Полная поддержка управления речью

Взаимодействие с Windows Forms
Визуальные элементы Эффекты для точечных рисунков

Кодирование изображений
Редактирование Буфер обмена формата RTF

Полная поддержка XAML

Программирование в режиме частичного доверия

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

Зона безопасности Поведение Получение полного доверия
Локальный компьютер Автоматическое получение полного доверия Никаких действий не требуется.
Интрасеть и надежные веб-сайты Запрос полного доверия Подпишите приложение XBAP с помощью сертификата, чтобы пользователь видел источник в запросе.
Интернет Сбой с сообщением "Доверие не оказано" Подпишите приложение XBAP с помощью сертификата.
Note

Поведение, описанное в предыдущей таблице, относится к приложениям XBAP с полным доверием, не следующим модели доверенного развертывания ClickOnce.

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

Определение разрешений с помощью CAS

В некоторых случаях общий код в сборках библиотеки будет использоваться как автономными приложениями и XBAP. В этих случаях код может выполнять функции, которые могут потребовать больше разрешений, чем позволяет набор разрешений, присвоенный приложению. Приложение может определять, независимо от того, имеется ли он имеет определенное разрешение с помощью системы безопасности Microsoft .NET Framework. В частности, его можно проверить на наличие определенного разрешения, вызвав Demand метод экземпляра нужного разрешения. Это показано в следующем примере, который содержит код, запрашивающий возможность сохранить файл на локальный диск.

using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;

namespace SDKSample
{
    public class FileHandling
    {
        public void Save()
        {
            if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
            {
                // Write to local disk
                using (FileStream stream = File.Create(@"c:\newfile.txt"))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to local disk.");
                }
            }
            else
            {
                MessageBox.Show("I can't write to local disk.");
            }
        }

        // Detect whether or not this application has the requested permission
        bool IsPermissionGranted(CodeAccessPermission requestedPermission)
        {
            try
            {
                // Try and get this permission
                requestedPermission.Demand();
                return true;
            }
            catch
            {
                return false;
            }
        }

    }
}

Если приложение не имеет нужных разрешений, вызов Demand создаст исключение безопасности. В противном случае разрешение будет предоставлено. IsPermissionGranted Инкапсулирует это поведение и возвращает true или false соответствующим образом.

Постепенное снижение функциональности

Возможность обнаружения у кода разрешений на выполнение действия представляет интерес для кода, который может выполняться из разных зон. Обнаружение зоны — это один из аспектов, однако рекомендуется по возможности предоставить пользователю альтернативу. Например, приложение с полным доверием обычно позволяет пользователям создавать файлы в любом расположении, тогда как приложение с частичным доверием может создавать файлы только в изолированном хранилище. Если код для создания файла существует в сборке, которая совместно используется приложениями с полным доверием (автономными) и приложениями с частичным доверием (размещенными в браузере), и оба приложения должны обеспечивать функцию создания файлов пользователем, общий код должен определить, выполняется ли он в режиме частичного или полного доверия перед созданием файла в соответствующем расположении. Оба варианта демонстрируются в следующем коде.

using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;

namespace SDKSample
{
    public class FileHandlingGraceful
    {
        public void Save()
        {
            if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
            {
                // Write to local disk
                using (FileStream stream = File.Create(@"c:\newfile.txt"))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to local disk.");
                }
            }
            else
            {
                // Persist application-scope property to
                // isolated storage
                IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
                using (IsolatedStorageFileStream stream =
                    new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to Isolated Storage");
                }
            }
        }

        // Detect whether or not this application has the requested permission
        bool IsPermissionGranted(CodeAccessPermission requestedPermission)
        {
            try
            {
                // Try and get this permission
                requestedPermission.Demand();
                return true;
            }
            catch
            {
                return false;
            }
        }

    }
}

Во многих случаях вы сможете найти альтернативу частичному доверию.

В управляемой среде, например интрасети, можно установить пользовательские управляемых инфраструктур для всех клиентов в глобальном глобальный кэш сборок (GAC). Эти библиотеки могут выполнять код, который требует полного доверия и можно ссылаться из приложений, которым разрешено только частичное доверие, используя AllowPartiallyTrustedCallersAttribute (Дополнительные сведения см. в разделе безопасности и безопасность WPF Стратегия — безопасность платформы).

Обнаружение узла браузера

С помощью CAS для проверки разрешений является подходящим способом, когда необходимо проверить на основе отдельных разрешений. Тем не менее эта методика зависит от перехвата исключений в рамках нормальной обработки, что не рекомендуется в общем и может вызывать проблемы производительности. Вместо этого Если ваш Приложение обозревателя XAML (XBAP) выполняется только в песочнице зоны Интернета, можно использовать BrowserInteropHelper.IsBrowserHosted свойство, которое возвращает значение true для XAML-приложения браузера (XBAP).

Note

IsBrowserHosted только отличает ли приложение выполняется в браузере, не какой набор разрешений приложения, выполнив.

Управление разрешениями

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

Таблица 3. Разрешений LocalIntranet и Internet

Разрешение Атрибут LocalIntranet Интернет
DNS Доступ к DNS-серверам Да Нет
Переменные среды Чтение Да Нет
Диалоговые окна для работы с файлами Открыть Да Да
Диалоговые окна для работы с файлами Без ограничений Да Нет
Изолированное хранилище Изоляция сборки по пользователю Да Нет
Изолированное хранилище Неизвестная изоляция Да Да
Изолированное хранилище Неограниченная квота для пользователя Да Нет
Мультимедиа Безопасные аудио-, видеоданные и изображения Да Да
Печать Печать по умолчанию Да Нет
Печать Безопасная печать Да Да
Отражение Вывод Да Нет
Безопасность Выполнение управляемого кода Да Да
Безопасность Утверждение предоставленных разрешений Да Нет
Пользовательский интерфейс Без ограничений Да Нет
Пользовательский интерфейс Безопасные окна верхнего уровня Да Да
Пользовательский интерфейс Собственный буфер обмена Да Да
Веб-браузер Безопасная навигация по фреймам в HTML Да Да
Note

Вырезание и вставка разрешены только в режиме частичного доверия при инициации пользователем.

Если вам требуется повысить уровень разрешений, необходимо изменить параметры проекта и манифест приложения ClickOnce. Дополнительные сведения см. в разделе Общие сведения о приложениях браузера WPF XAML. Следующие документы также могут быть полезны.

  • Mage.exe (средство создания и редактирования манифеста)

  • MageUI.exe (средство создания и редактирования манифестов, графический клиент)

  • Защита приложений ClickOnce

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

Кроме того, модель доверенного развертывания ClickOnce можно использовать для полностью доверенного развертывания из любой зоны безопасности. Дополнительные сведения см. в разделе Trusted Application Deployment Overview и безопасности.

См. также

  • Безопасность
  • Стратегия безопасности WPF — безопасность платформы
  • Стратегия безопасности WPF — проектирование безопасности
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX