Если ваше приложение работает в Windows Vista или Windows 7, и вы используете WCF NetNamedPipeBinding, вы автоматически получите службу, доступную только из того же сеанса, при условии, что процесс, реализующий конец службы канала, не имеет привилегия SeCreateGlobalPrivilege. На практике это обычно означает, что сервером может быть любая программа, запущенная в интерактивном сеансе, при условии, что она не запускается с помощью администратора запуска.
Причина, по которой это так, касается именованного объекта общей памяти, который WCF создает для публикации фактического имени канала (GUID) для потенциальных клиентов. Я объясняю этот механизм в своем блоге. Если сервисный процесс имеет SeCreateGlobalPrivilege, этот объект публикации создается в глобальном пространстве имен ядра, видимом для всех сеансов; если у него нет этой привилегии, объект создается в локальном пространстве имен ядра, видимом только в том же сеансе. Обратите внимание, что это не обеспечивает абсолютной безопасности: теоретически к именованному каналу можно получить доступ из другого сеанса (используя собственные вызовы API, а не клиентский стек WCF), если GUID имени канала каким-либо образом был раскрыт другим способом.
Если вам нужно поддерживать более раннюю ОС или если вам нужна абсолютная безопасность на самом канале, вам нужно будет явно реализовать ограничение, изменив DACL на канале после того, как стек канала службы WCF его создал. Для этого потребуется немного поработать со стандартной привязкой, и я покажу , как это можно сделать. здесь. Вам также потребуется написать некоторый код P / Invoke, который не очень прост, чтобы определить правильный SID сеанса входа в систему, для которого нужно создать ACE в DACL. В .NET 4 стек службы WCF сам обнаруживает и использует SID сеанса входа в систему, чтобы ограничить разрешение на создание новых экземпляров канала, поэтому вы можете использовать Reflector, чтобы посмотреть, как он это делает - см .: System.ServiceModel.Channels.SecurityDescriptorHelper.GetProcessLogonSid()
.
person
Chris Dickson
schedule
31.01.2011