2014-02-21 66 views
0

說,我有4個服務器,一個公開可見(A),其他(B,C和D)只對一個(A)可見。 其中B,C和D是相同的服務,各自在自己的公司。基於內容的WCF路由

根據呼叫中使用的客戶端證書,我可以將客戶端到服務器A的呼叫路由到服務器B,C或D嗎?

此外,是否可以指定到服務器A的消息內的目的地是什麼? (需要部分加密的信息)(例如:我需要向公司C提供員工記錄,但A不應該能夠讀取記錄。)

我的意思是,這當然是可能的,如果我重新 - 在A上實現B,C和D的服務,並且讓A成爲B,C和D的新客戶端。 但是,我希望將消息從客戶端保護到B,C或D,並且只允許A瞭解將其交付給他們需要知道的內容。 因此,如果我重新實現該服務,那麼我將無法使用WCF可以提供的透明消息加密,因爲它只是將其解密。

編輯:

的目標是從客戶端B,C或d獲得的數據,同時,B,C或d只接受來自A. TCP包和,A不允許讀取數據意思是B,C或D.

回答

0

簡短的回答是可以的,WCF技術可以做這些事情。

較長的回答:是的,您可以將「A」設置爲SSL WCF端點。例如,一個入站請求可能有一個客戶端證書或內部值指向它的最終目的地「B」,「C」或「D」。

所以工作流將是這樣的:

  • 客戶端應用程序intializes WCF客戶端和聯繫人服務器 「A」

  • 「A」 協商SSL與客戶端應用程序

  • 「A」WCF Web服務主機接收入站SSL請求。

  • 「A」 decryptes消息

  • 「A」 的檢查內容的目的地 - 原來的最終目的地是 「d」

  • 「A」 初始化WCF客戶端連接

  • 「A」將WCF客戶端URL設置爲「D」WCF主機端點URL

  • 「D」接收來自「A」的初始請求,初始化SSL通信

  • 服務器「A」WCF客戶端將新加密的請求轉發給「D」,解密,處理,然後發回確認「A」中繼回到原始客戶端。

當然這裏有很多選項,但除了加密細節外,工作流程大致相同。

如果在傳遞消息之前服務器「A」不應該讀取消息的內容,我不確定你要去哪裏。基本上,SSL是全部或沒有。

除了SSL,另一種常用的加密方法是消息級(SOAP)加密,但只有在客戶端發送原始消息的設備上駐留有用於消息加密的證書的公鑰和私鑰。因此,可以想象,您可以讓客戶端向服務器「A」發送SSL封裝的請求,該服務器的內部內容使用「A」無法讀取的消息加密進行加密。在請求標題中可能有足夠的未加密信息,「A」知道將消息路由到服務器「D」。

但我只會這樣做,如果我們正在談論服務器到服務器的流量。如果你正在談論使用iPhone的客戶,那麼我建議不起作用。

+0

那麼,我正在尋找的設置將手機連接到邊緣服務器(A),然後這個人轉發到內部最終目的地(B,C,..)。因此,將客戶端上的URL重定向到B或者這樣做是不可能的,因爲它們不接受來自其他任何人的流量A.但是A不允許查看數據包的內容,而僅查看標題。 但隨着WCF剛剛調用服務的方法,我看不到添加額外頭文件的方式,除非可能手動加密數據並在調用中將其提供爲blob。 void sendData(EndpointType destination,DataBlob encryptedData); –

+0

好的,如果原始請求來自電話,我沒有看到解決方法,即服務器「A」可以在不讀取內部內容的情況下檢測目標「B」或「C」。使用SSL,整個消息將被加密或解密。只有使用基於消息的加密,才能加密消息的正文,而不必單獨使用標題。但是消息(肥皂)加密需要爲每個客戶端提供非常具體的證書安裝過程;對於普通用戶來說肯定太複雜。對不起......祝你好運。 – Brian

+0

此外,即使您可以隱藏請求URL(查詢字符串)中的某些信息,也無法通過(比如說)「B」,通過「A」和您的iPhone建立SSL連接。 SSL協商必須直接在客戶端和主機之間進行...因此不需要。 – Brian