2015-10-24 80 views
1

我有一個具有多個端點的服務。這些端點從客戶端獲得請求,也從彼此獲取請求。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服務位於同一服務器中?

回答

5

在我的愚見中,最簡單和最安全的方法是僅使用本地調用某些方法,即使用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"); 

問候

+0

我使用的是活的列表來保持在線客戶以任意發送通知給他們回調通道。因此我需要在同一個服務實例中擁有這些方法。我認爲最簡單的不會在我的情況下完成這項工作:) –

+0

它會完成這項工作。我不在我的工作電腦上。但是如果需要的話,我可以儘快向您展示配置代碼。只是告訴。 Registers –

+0

如果您向我展示配置,即使我仍然不確信這種方法,如果我學會了一種管理方法,那將會很棒。順便說一句,我們可能需要繼續關於聊天的討論。 –

相關問題