Используя сеть WCF.труба в веб-сайте с impersonate=true


Я пытаюсь использовать именованные каналы WCF на веб-сайте, и это не удается с ошибками:

В сети не было прослушивания конечной точки.pipe: / / localhost / mypipename это могло бы принять сообщение. Это часто вызвано неправильным адрес или действие мыла. Смотрите раздел InnerException, если он есть, для получения дополнительной информации подробности.

И внутреннее исключение:

The pipe name could not be obtained for net.pipe://localhost/mypipename.

И есть еще одно внутреннее исключение, дающее сообщение access denied.

Мой веб-сайт использует олицетворение, и глядя в интернете, это кажется уместным, но я не знаю, как это исправить.

У кого-нибудь есть какие-нибудь идеи?

Спасибо Matt

3 4

3 ответа:

Стандартная привязка WCF Netnamedpipes создает случайно сгенерированное имя канала при запуске службы, а также объект общей памяти ядра, с которым клиентский стек каналов WCF должен проконсультироваться, чтобы узнать имя канала.

Использование олицетворения на веб-узле означает, что контекст безопасности, из которого вызывается служба WCF, имеет маркер входа (маркер олицетворения), который включает членство в группе пользователей Сети.

Когда служба при запуске прослушивателя привязка WCF создает список управления доступом (ACL) как для самого именованного канала, так и для объекта общей памяти, в котором публикуется имя канала. Оба этих списка управления доступом запрещают доступ к группе пользователей Сети. Таким образом, вашему веб-сайту, олицетворяющему удаленного пользователя, будет отказано в доступе к объекту общей памяти, прежде чем он сможет даже обнаружить имя канала. Даже если бы он узнал название трубы каким-то другим способом, ему все равно было бы отказано в доступе к трубе.

Все работает, когда вы удаляете олицетворение, потому что теперь служба вызывается в контексте безопасности рабочего процесса веб - приложения, чей маркер входа не имеет членства в группе пользователей сети-это локальный вход в систему.

Подробнее в http://blogs.charteris.com/blogs/chrisdi Если вам интересно. Я показываю, как можно настроить ACL, и в принципе этот подход может быть использован для предоставления доступа удаленным пользователям, но я не рекомендую этого делать.

Если вы получаете это конкретное исключение, это обычно означает, что ваша служба не запущена. Я вижу, что вы используете localhost в URL. Я просто хочу убедиться, что хост и служба работают на одной машине. WCF не разрешает обмен данными между машинами с этой привязкой.

Когда я получаю это сообщение, обычно я проверяю и вижу, что забыл запустить службу, таким образом, нет прослушивания конечной точки. Пожалуйста, убедитесь, что ваша служба действительно работает и не разбился в то время, когда создается исключение. Если это не решит проблему, пожалуйста, опубликуйте свой прогресс, и я смогу сделать больше предложений.

Я обошел проблему, сделав конечную точку IIS, где я в конечном итоге вызывал сетевой канал, доступной для анонимных пользователей, что означало отсутствие олицетворения.