Чтение IP-адреса звонящего в WCF (OperationContext имеет значение null)? - PullRequest
8 голосов
/ 19 января 2009

Я проверяю пользователей, используя UserNamePasswordValidator.Validate (строковое имя пользователя, строковый пароль), и служба сама размещается (например, нет IIS).

Проблема, с которой я столкнулся, заключается в том, что если пользователь не проходит проверку, я хочу отслеживать IP-адрес пользователя. Это работает нормально, если пользователь проходит валидацию, потому что затем OperationContext был инициализирован (он равен нулю внутри метода validate и не создается до более поздней версии).

Кто-нибудь знает, как получить IP-адрес клиента в методе validate или перед его выполнением?

Да, я знаю, как получить IP-адрес с помощью RemoteEndpointMessageProperty, но, как я уже сказал, он никогда не доберется до такого уровня, если проверка не пройдена: -)

Ответы [ 2 ]

1 голос
/ 11 мая 2009

Я исследовал это до смерти всю неделю и не могу придумать ни одной записи в блоге или статьи MSDN, посвященной этой проблеме.

Насколько я могу судить, вы не можете регистрировать IP-адрес на этапе проверки.

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

0 голосов
/ 26 июня 2009

Если вы размещаете в IIS, это становится намного проще. Этот кусок конфигурации поступает прямо из моего хостингового веб-проекта и заставляет запросы ASP.NET проходить по конвейеру IIS, а не отправляться прямо в биты ошибки IIS ASP.

aspNetCompatibilityEnabled: когда для этого атрибута установлено значение правда, запросы к службам Windows Communication Foundation (WCF) поток через HTTP-конвейер ASP.NET и связь через не HTTP протоколы запрещены.

См .: http://msdn.microsoft.com/en-us/library/ms731336.aspx

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

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

Хотя я думаю, что это применимо к MS AuthenticationService, для любых других ваших служб этот атрибут потребуется:

[AspNetCompatibilityRequirements (RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] * ​​1013 *

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

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

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.channeldispatcher.aspx

Edit:

Добавив эту ссылку, я думаю, что вам нужно разобраться с вещами в WCF, которые находятся прямо в стеке, прежде чем они попадут в ваш код:

http://blogs.msdn.com/sonuarora/archive/2007/06/11/passing-soap-actions-to-adapter-inbound-handler-for-filtering-type-of-listeners.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...