在WCF中读取调用者的IP地址(OperationContext为null)?

时间:2009-01-19 14:06:17

标签: wcf validation

我正在使用UserNamePasswordValidator.Validate(字符串用户名,字符串密码)验证用户,并且服务正在托管自己(例如没有IIS)。

我遇到的问题是,如果用户验证失败,我想跟踪用户的IP地址。这样可以很好地验证用户的验证,因为OperationContext已经初始化(在validate方法中为null,直到稍后才创建)。

有没有人知道如何在validate方法中或在执行validate方法之前获取客户端IP地址?

是的,我知道如何使用RemoteEndpointMessageProperty获取IP地址,但就像我说的那样,如果验证失败,它永远不会那么远: - )

2 个答案:

答案 0 :(得分:1)

我整个星期都研究过这个问题,而且我无法想出一篇关于这个问题的博客文章或MSDN文章。

据我所知,您无法在验证阶段记录IP地址。

我建议的唯一解决方法是在IIS中托管并使用那里的weblog,它们会记录IP地址。不幸的是,这很痛苦,但这可能是唯一的方法。

答案 1 :(得分:0)

如果您在IIS中托管,那么这将变得更加简单。这个配置块直接来自我的托管Web项目,并强制ASP.NET请求从IIS管道进入,而不是直接发送到IIS的ASP错误位。

aspNetCompatibilityEnabled:当此属性设置为  是,对Windows Communication Foundation(WCF)服务的请求  流经ASP.NET HTTP管道,并进行通信  禁止非HTTP协议。

请参阅:http://msdn.microsoft.com/en-us/library/ms731336.aspx

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

我使用AuthenticationService并利用HttpContext来获取有关客户端的所有有趣内容,其中大部分内容对于确保用户不从六个不同的子网登录以及使用饼干。

虽然我认为这适用于MS AuthenticationService,但您拥有的任何其他服务都需要此属性:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

如果你想继续你的非IIS托管服务路由,那么我会看到MS API里面有什么东西可以使用反射,在停止时用调试器在WCF上查找,展开所有那些非公共成员

我认为问题是获得一些WCF的引用,该WCF初始化从中开始戳。在设置服务主机时,您可能必须向其中一个调度程序注册某种类型的侦听器。

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

编辑:

添加此链接,我的想法是,您需要在到达代码之前在WCF中找到正确的内容:

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