Разграничение доступа из кода в WCF - Частично доверенные службы
ОГЛАВЛЕНИЕ
Частично доверенные службы
В .NET Framework 3.0 единственный способ выполнения службы на условиях частичного доверия состоял в явном разрешении пользоваться только полномочиями, необходимыми службе для работы и, следовательно, неявном отказе во всех других полномочиях. Одним из путей достижения этого являлось применение атрибутов полномочий с флагом SecurityAction.PermitOnly. Рассмотрим службу в следующей ситуации.
[SecurityPermission(
SecurityAction.PermitOnly,
Execution = true)]
[UIPermission(SecurityAction.PermitOnly,
Window =
UIPermissionWindow.SafeTopLevelWindows)]
class MyService : IMyContract {
public void MyMethod() {
Form form = new TestForm();
form.ShowDialog();
}
}
Службе требуется полномочие для ее выполнения (как в случае любого управляемого кода), а кроме этого ей необходимо полномочие для отображения безопасных окон. Если бы требовалось скомпоновать для класса несколько атрибутов полномочий типа «только разрешение», это привело бы к единственному набору полномочий на этапе выполнения.
В .NET Framework такой подход используется для разрешения только этих полномочий и для активного отклонения всех других полномочий посредством установки специального модификатора анализа стека. В результате, даже если сборка, в которой находится служба (как и область приложений), предоставляет службе полное доверие, во всех других полномочиях службе будет откaзано.
Когда служба пытается выполнить некую операцию, например открытие файла, создается исключение безопасности, поскольку запрос на операцию ввода или вывода файла сталкивается со модификатором анализа стека, который активно отказывает в этом полномочии. Все, что остается делать службе, это выполняться в своей виртуальной «песочнице» и отображать безопасные окна. .NET Framework изменит заголовок окна и выведет предупреждающий тег в отображаемую форму, чтобы проинформировать пользователя о том, что приложение является частично доверенным.
Вместо указания полномочий в качестве атрибутов их можно перечислить в файле XML, содержащем набор полномочий, и предоставить имя этого файла методу PermissionSetAttribute, как показано на рис. 3.
Рис. 3 Использование файла с набором полномочий для частично доверенной службы
<!-- MyServicePermissions.xml -->
<PermissionSet class = "System.Security.PermissionSet">
<IPermission
class = "System.Security.Permissions.SecurityPermission"
Flags = "Execution"
/>
<IPermission
class = "System.Security.Permissions.UIPermission"
Window = "SafeTopLevelWindows"
/>
</PermissionSet>[PermissionSet(SecurityAction.PermitOnly,File =
"MyServicePermissions.xml")]
class MyService : IMyContract {
public void MyMethod() {
Form form = new TestForm();
form.ShowDialog();
}
}
Обратите внимание, что файл с набором полномочий используется только на этапе компиляции и бесполезен при развертывании. Компилятор внедрит разрешенные полномочия в класс метаданных в качестве отдельных атрибутов. Если файл отсутствует, сборка закончится аварийно.