WCF如何检测客户端和服务器是否在同一服务器中

时间:2015-10-24 06:11:32

标签: c# wcf

我有一个包含多个端点的服务。这些端点从客户端获取请求,也从彼此获取请求。

对于从其他端点获取请求的方法,我需要确保只能从服务器内调用该方法。

我已经有了一个身份验证过滤器拦截机制。我可以将此功能绑定到那些特定方法。我无法弄清楚的是如何判断来自同一服务器的请求。请查看我用于身份验证的以下代码段:

public class ServiceUser_Authenticator : IParameterInspector
{
    public object BeforeCall ( string operationName, object[] inputs )
    {
        var ip = ( OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty ).Address;

        if ( ip != /* 127.0.0.1 , localhost , RealIP of the server */ )
            throw new FaultException("Access denied");

        return null;
    }
    ...
}

我正在考虑检查客户的ip是否与我的相同,但不知道如何。 RealIP(external)可能会起作用,但最好是非静态值。

那么,如何检查wcf调用的客户端是否与wcf服务位于同一服务器中?

1 个答案:

答案 0 :(得分:6)

在我看来,使一些方法仅在本地调用的最简单,最安全的方法是使用NetNamedPipeBinding

所以我会把所有的"本地"方法并将它们放在一个单独的界面中。 我会用NetNamedPipeBinding公开该接口。

修改
您可以在相同服务上公开不同的界面 每个接口都可以有自己的绑定。

编辑2 - 代码示例

在以下两个示例中,这里是公开两个接口的服务类

class ServiceHelloWorld : IPublicInterface, ILocalInterface

<强> 1。许多端点可以通过xml 来公开 它们不是相同的接口。 :

<services>
  <service name="HelloWorldService.ServiceHelloWorld">
    <endpoint address="net.tcp://localhost:7000/publicinterface" 
      binding="netTcpBinding" contract="IPublicInterface">
    <endpoint address="net.pipe://localhost:8000/privateinterface" 
      binding="netNamedBinding" contract="ILocalInterface">
  </service>
</services>

<强> 2。许多端点可以通过代码公开

这些不再是相同的接口。

ServiceHost host =
   new ServiceHost(typeof(ServiceHelloWorld), new Uri[] { });
host.AddServiceEndpoint(typeof(IPublicInterface), 
   new NetTcpBinding(), "net.tcp://localhost:7000/publicinterface");
host.AddServiceEndpoint(typeof(ILocalInterface), 
   new NetNamedPipeBinding(), "net.pipe://localhost:8000/privateinterface");

此致