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 上的凭据

如何在 WCF 中保存用户对象

使用 System.ServiceModel.ServiceAuthenticationManager 自定义 WCF 身份验证?

WCF WebHttp 混合身份验证(基本和匿名)