Разграничение доступа из кода в WCF - Структурированные требования безопасности на стороне размещения
ОГЛАВЛЕНИЕ
Структурированные требования безопасности на стороне размещения
Переработанный класс ServiceHostActivator, пригодный для частично доверенных источников вызовов, показан на рис. 9. Метод CreateHost класса ServiceHostActivator не может декларативно заявлять полное доверие, поскольку это помешает ему запрашивать соответствующее полномочие вызывающего кода на размещение. Вместо этого он программным образом использует класс CodeAccessSecurityHelper для создания набора полномочий полного доверия и подтверждает его, затем переходит к созданию размещения. Когда WCF запрашивает полное доверие, утверждение препятствует подъему этого запроса в стеке вызовов.
Рис. 9 Переработанный класс ServiceHostActivator
class ServiceHostActivator : MarshalByRefObject {
public void CreateHost(Type serviceType,Uri[] baseAddresses) {
CodeAccessSecurityHelper.PermissionSetFromStandardSet(
StandardPermissionSet.FullTrust).Assert();m_Host = new ServiceHost(serviceType,baseAddresses);
PermissionSet.RevertAssert();
m_Host.DemandHostPermissions();
}//Behavior demands happen here, must assert
[PermissionSet(SecurityAction.Assert,Unrestricted = true)]
public void Open() {
m_Host.Open();
}
...
}
После создания размещения CreateHost явно изменяет подтверждение на противоположное. Затем CreateHost вызывает вспомогательный метод расширения DemandHostPermissions класса CodeAccessSecurityHelper из только что созданного экземпляра размещающего класса, чтобы запросить полномочия на размещение. DemandHostPermissions исследует объект размещения и запрашивает соответствующие полномочия.
Например, если размещение поддерживает конечную точку TCP, тогда DemandHostPermissions запрашивает полномочие на выполнение и полномочие на принятие вызовов TCP на идентификаторе URI конечной точки. Если надежный обмен сообщениями используется посредством TCP, то DemandHostPermissions запрашивает полномочие на управление политикой. Существует немало дополнительных возможных запросов, как показано на рис. 10.
Рис. 10 Запросы на стороне размещения, структурированные посредством AppDomainHost
Случай | Полномочия |
---|---|
TCP | Полномочие безопасности с исполнением, полномочие сокета на принятие вызова TCP на идентификаторе URI |
IPC | Полномочие безопасности с исполнением, управлением политикой и доказательствами |
MSMQ | Полномочие безопасности с исполнением, полномочие MSMQ на чтение из очереди |
WS, WS-Dual, Basic, Web | Полномочие безопасности с исполнением и инфраструктурой и веб-полномочие для приема вызовов на идентификаторе URI |
RM через TCP | Полномочие безопасности для управления политикой |
Проверенные на подлинность вызовы | Полномочие безопасности для управления участником |
Распространение транзакций | Неограниченное полномочие распределенных транзакций |
Учетные данные имени пользователя с безопасностью сообщений, учетные данные сертификатов с проверкой и сертификат службы | Полномочие хранилища на перечисление хранилищ, открытие хранилища и перечисление сертификатов |
Диагностическое отслеживание | Полномочие среды на чтение COMPUTERNAME, полномочие ввода и вывода файлов на обнаружение пути, добавление и запись в файлы журнала |
Счетчики производительности службы WCF | Полномочие счетчика производительности на запись в счетчик службы и в счетчик операции |
Счетчики общей производительности WCF | Полномочие счетчика производительности на запись в счетчик службы, запись в счетчик конечной точки, запись в счетчик операции и запись в счетчик размещения |
Поставщики ASP.NET | Минимальное полномочие на размещение ASP.NET |
Использование привязки IPC требует полномочия на управление политикой и доказательствами. Использование привязки MSMQ инициирует запрос полномочия на чтение из очереди конечной точки. Использование любой из привязок HTTP инициирует запрос на принятие вызовов на адресе конечной точки. Если привязка использует проверенные на подлинность вызовы, то DemandHostPermissions запрашивает полномочия на управление участником.
Использование привязки с поддержкой транзакции, активированным потоком транзакций и по крайней мере одной операцией из контракта конечной точки с разрешенным (или обязательным) потоком транзакций приводит к запросу неограниченного полномочия распределенных транзакций.
Любой доступ к хранилищу сертификатов, например для защиты сообщений, проверки сертификата клиента или использования сертификата службы для защиты сообщения, влечет запрос перечисления хранилищ для открытия хранилища и перечисления сертификатов.
Если служба выполняет диагностику, класс DemandHostPermissions запрашивает доступ к переменной среды имен компьютеров и полномочие на файловый ввод/вывод в этот файл. Если размещение использует счетчики производительности WCF, класс DemandHostPermissions запрашивает полномочия на запись в эти счетчики на указанном уровне.
Если для проверки подлинности источника вызова или членства в роли размещение опирается на поставщики ASP.NET, класс DemandHostPermissions запрашивает минимальные полномочия размещения ASP.NET (такие полномочия требуются всем поставщикам). При выполнении обратного вызова посредством привязки WS-Dual сама привязка запрашивает веб-полномочие для подключения к данной конечной точке обратного вызова, поэтому у класса AppDomainHost нет необходимости явно запрашивать его при запуске размещения.