Веб-служба не может открыть именованный канал — доступ запрещен

У меня есть служба C++, которая предоставляет именованный канал клиентам с NULL SECURITY_ATTRIBUTES следующим образом:

hPipe = CreateNamedPipe( lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, 0, NULL);

Существует dll, которая использует этот канал для получения услуг.

Существует графический интерфейс С#, который использует dll и отлично работает.

Существует веб-сайт .net, который также использует эту dll (точно такую ​​же на том же компьютере), но всегда получает отказ в разрешении, когда пытается открыть канал.

Кто-нибудь знает, почему это может произойти и как это исправить?

Также кто-нибудь знает хороший учебник по SECURITY_ATTRIBUTES, потому что я еще не понял информацию msdn.

Спасибо, Патрик


person Patrick    schedule 04.12.2008    source источник


Ответы (3)


ACL по умолчанию для именованных каналов (то, что вы получаете с нулевым дескриптором безопасности) предоставляет доступ на запись только для LocalSystem, администраторов и владельца/создателя канала. Если ваше веб-приложение не работает под одной из этих учетных записей (которой по умолчанию не будет), вы не сможете получить доступ для записи. (Я предполагаю, что вы запрашиваете чтение/запись.)

Есть пару вариантов...

  1. Запустите веб-приложение под той же учетной записью, что и служба, создавшая канал.

  2. Настройте веб-приложение для использования олицетворения, либо указав конкретного пользователя с доступом на запись в web.config, либо настроив его на использование пользователя, переданного IIS (и доступ к приложению из учетной записи пользователя с доступом на запись).

  3. Вручную олицетворяйте пользователя с правами на запись на время доступа к каналу (например, с помощью WindowsIdentity.Impersonate).

  4. Используйте дескриптор безопасности не по умолчанию в канале, который предоставляет доступ на запись всем (или конкретной учетной записи, на которой запущено приложение, хотя это будет сложнее настроить).

Пример создания простого дескриптора безопасности здесь; вы должны быть в состоянии изменить его в соответствии с вашими потребностями.

person Eric Rosenberger    schedule 05.12.2008

Проверьте тип проверки подлинности, используемый на веб-сайте ASP.NET, и параметры олицетворения в файле web.config для этого сайта. Скорее всего, код ASP.NET выполняется под учетной записью, которой не разрешено создавать именованные каналы на вашем компьютере.

Возможно, вы сможете исправить это, предоставив больше разрешений учетной записи, используемой приложением ASP.NET, или настроив это веб-приложение для использования другой учетной записи (с более высокими привилегиями). Сказав это, вы действительно хотите, чтобы удаленные посетители вашего веб-сайта могли создавать именованные каналы? Я не буду читать вам лекции, я полагаю, вы думали об этом.

Самое доступное и подробное описание SECURITY_ATTRIBUTES, которое я когда-либо видел, содержится в этой книге Кейта Брауна... http://www.amazon.co.uk/gp/product/0201604426.

person Martin    schedule 04.12.2008
comment
О, не стесняйтесь читать лекцию. Для пояснения: веб-служба не создает канал, а вызывает функцию dll, которая открывает канал, уже созданный службой Windows. Я предполагал, что это будет безопасно? - person Patrick; 04.12.2008

Добавление строки:

‹ олицетворение личности = "истина"/>

в разделе ‹ system.web> файла web.config разрешен доступ к каналу. Я бы не советовал другим использовать это, так как я не уверен в последствиях для безопасности, но на данный момент это соответствует нашим требованиям.

Спасибо Эрику и Мартину за то, что они указали мне правильное направление.

person Patrick    schedule 08.12.2008