Если ваше приложение работает в Windows Vista или Windows 7, и вы используете WCF NetNamedPipeBinding, вы автоматически получите услугу, доступную только с одного и того же сеанса. ПРЕДОСТАВЛЯЕТ, что процесс, который реализует конец службы у трубы нет привилегии SeCreateGlobalPrivilege. На практике это обычно означает, что сервер может быть любой программой, запущенной в интерактивном сеансе, при условии, что она не запущена с помощью «Запуск от имени администратора».
Причина, по которой это так относится к именованному объекту общей памяти, который WCF создает для публикации фактического имени канала (GUID) для потенциальных клиентов. I explain this mechanism on my blog. Если сервисный процесс имеет SeCreateGlobalPrivilege, этот объект публикации создается в пространстве имен Global kernel, видимом для всех сеансов; если он не имеет этой привилегии, объект создается в пространстве имен локального ядра, видимом только в пределах одного сеанса. Обратите внимание, что это не обеспечивает абсолютной безопасности: сам именованный канал можно было бы получить в теоретическом виде из другого сеанса (используя собственные вызовы API, а не стек WCF), если бы идентификатор GUID канала каким-то образом был раскрыт другим способом.
Если вам нужна поддержка более ранней ОС или если вы хотите абсолютную безопасность самого канала, вам нужно будет реализовать это ограничение явно, изменив DACL на трубе после того, как стек канала WCF создал его. Это требует некоторого вмешательства со стандартной привязкой, и я показываю how this can be done here. Вам также необходимо написать код P/Invoke, который не является особенно простым, чтобы обнаружить правильный SID сеанса входа в систему, для которого необходимо создать ACE в DACL. В .NET 4 сам стек службы WCF обнаруживает и использует идентификатор сеанса входа в систему, чтобы ограничить разрешение на создание новых экземпляров канала, чтобы вы могли использовать Reflector, чтобы посмотреть, как он это делает - см.: System.ServiceModel.Channels.SecurityDescriptorHelper.GetProcessLogonSid()
.
Сброс C# устарел и больше не рекомендуется MS. Вы должны использовать сервисную службу WCF. –
См. Http://msdn.microsoft.com/en-us/library/72x4h507.aspx: «Этот раздел относится к унаследованной технологии, которая сохраняется для обратной совместимости с существующими приложениями и не рекомендуется для новой разработки. теперь должны быть разработаны с использованием Windows Communication Foundation (WCF) » –