我有一个包含多个端点的服务。这些端点从客户端获取请求,也从彼此获取请求。
对于从其他端点获取请求的方法,我需要确保只能从服务器内调用该方法。
我已经有了一个身份验证过滤器拦截机制。我可以将此功能绑定到那些特定方法。我无法弄清楚的是如何判断来自同一服务器的请求。请查看我用于身份验证的以下代码段:
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服务位于同一服务器中?
答案 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");
此致