UserNamePasswordValidator 中的客户端 IP 地址
Posted
技术标签:
【中文标题】UserNamePasswordValidator 中的客户端 IP 地址【英文标题】:Client IP address in UserNamePasswordValidator 【发布时间】:2013-04-20 14:09:43 【问题描述】:我有一个由 Windows 服务托管的 WCF REST 休息服务。它使用自定义 UserNamePasswordValidator 身份验证。
我想在认证时获取客户端IP地址:
ublic static string GetClientIPAddress()
try
var context = OperationContext.Current;
var prop = context.IncomingMessageProperties;
var endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
return endpoint.Address;
catch (System.Exception exc)
Debug.Assert(false,exc.Message);
return string.Empty;
但它会引发异常,因为在这种情况下上下文为空。我该如何解决这个问题?请注意,大多数建议的 asp.net 兼容模式不是一个选项,我的服务由 WIndows 服务托管,而不是由 IIS 托管。
谢谢!
【问题讨论】:
你为什么不使用 IIS ? 因为我要安装到更多机器上,没有使用IIS的地方 但如果你正在制作一个 .net 应用程序,那么你就放了这个应用程序。在服务器上安装 IIS 就是这样,所以你不需要在每个客户端上都安装它.. 谢谢,但这不是问题,这是事实,必须在没有IIS的情况下运行 不幸的是,ASP.NET 兼容性答案无处不在,这使得寻找问题的解决方案变得非常具有挑战性。在过去的几个小时里,我一直试图推倒这堵墙。我尝试使用自定义 IErrorHandler,但不幸的是,自定义 UserNamePasswordValidator 的 Validate 方法似乎是验证失败时调用的最后一件事。从那里抛出的任何异常,无论是 FaultException 还是其他异常,最终都不会由 IErrorHandler 处理。 UserNamePasswordValidator 在它自己的线程上运行,因此调用的上下文在对 Validate 的调用中为空。 【参考方案1】:嘿,试试应该可行的解决方案。
private string GetClientIp(HttpRequestMessage request)
if (request.Properties.ContainsKey("MS_HttpContext"))
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
RemoteEndpointMessageProperty prop;
prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
else
return null;
【讨论】:
如果没有可用的上下文,HttpRequestMessage
会从哪里来?
使用私有方法发布答案而没有调用位置的上下文是没有帮助的。以上是关于UserNamePasswordValidator 中的客户端 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章
Silverlight 故障传播和 UserNamePasswordValidator
WCF REST:使用我自己的自定义验证器时加密凭据 - UserNamePasswordValidator?
在每次调用时重新验证 WCF UserNamePasswordValidator 上的凭据
使用 System.ServiceModel.ServiceAuthenticationManager 自定义 WCF 身份验证?