2009-08-07 89 views
1

如果我託管一個WCF服務,以便某個人(即我知道的某個人)可以使用我的服務,但如果其他人(即我不知道的人)使用它,那麼會怎樣呢?我如何防止這種情況發生?如何實現這一目標?如何防止他人添加託管的wcf服務的服務引用?

它可以通過服務節流或其他方式來實現嗎?

回答

1

不,在WCF中沒有任何機制允許某些客戶端使用您的服務,同時禁止他人。你需要從另一個角度來看待這個問題。

一種方法是不自動發佈您的服務中的元數據 - 例如,使它幾乎「不可見」 - 然後以一個或多個WSDL以及一個或多個XSD文件的形式將必要的元數據信息分發給您希望連接到您的服務的客戶端。如果您的元數據不可用,那麼只是瀏覽您的服務地址的人將無法獲得有關要致電的信息。

元數據交換由<serviceMetadata>行爲控制,並且在您的服務上有一個「mex」端點。刪除這兩個,你的服務是不可見的。

另一種方法是禁止任何外部用戶根據防火牆和網絡規則訪問您的WCF服務器。這不能由WCF完成,但是您的網絡管理員可能會限制哪些IP對WCF服務運行的機器具有物理訪問權限。

馬克

UPDATE:
爲了出貨元數據,以這些用戶應該能夠打電話給你的服務誰,你可以做兩件事情之一:

1)使用svcutil.exe /t:metadata (path+name of your service assembly),可以提取來自服務程序集的元數據(例如MyServiceLibrary.dll)。這將爲您提供一個或多個WSDL以及一個或多個XSD文件,您需要將這些文件發送給目標用戶。他們可以將這些文件放在他們的硬盤上的某個地方,然後在「添加服務參考」中,而不是輸入URL來發現服務,他們可以鍵入主WSDL的名稱(導入所有其他文件),他們會得到他們的客戶代理。

或者:

2)隨着服務啓動並運行,你可以「添加新項目」,以您的解決方案,選擇一個類庫(MyService.Client),然後做一個「添加服務引用」,並輸入您的服務URL。這將創建新類庫中的所有必需文件和所有內容。編譯此類庫並將該程序集MyService.Client.dll發送給您希望允許訪問您的服務的用戶。

使用這兩種解決方案,您不需要啓用元數據交換,並且其他人不能只是走到您的服務並獲取所需的所有信息來調用它。

+0

但是服務使用元數據交換端點來向客戶描述自己嗎?如果我刪除端點並使,那麼如果我不能發佈它,以及如何在客戶端上添加服務引用? – kurozakura 2009-08-07 08:06:19

+0

我認爲這正是你想要的 - 不允許每個人都添加服務引用,對吧?在這種情況下,您需要將WSDL和XSD發送給應該使用您的服務的客戶端,並且他們需要根據他們獲得的文件(而不是URL)添加服務引用。或者您可以編寫自己的代理客戶端類並將其放入程序集中,並將該預先構建的客戶端代理髮送給應該能夠調用您的服務的用戶。 – 2009-08-07 08:14:43

+0

感謝marc:D我知道它可以通過代理來實現,但我認爲我們可以同時使用url添加服務,並且只允許特權客戶端,這樣他們就可以更新服務而不是再次更新編譯爲DLL並將其部署到客戶端 – kurozakura 2009-08-07 08:56:06

2

如果您希望某些客戶端能夠使用(或查看)您的服務,並且某些客戶端不允許使用(或查看)您的服務,那麼您需要在服務上設置身份驗證,以便只有客戶端您允許訪問(或查看)您的服務。

我不知道你的整個場景,但使用基本身份驗證的傳輸安全性可能就足夠了。爲了讓你會禁用IIS匿名訪問,IIS配置爲使用基本身份驗證,然後在綁定的配置設置:

<security mode="Transport"> 
    <transport clientCredentialType="Basic" /> 
</security> 


設置你的MEX結合使用,而不是默認的mexHttpBinding安全綁定。 您還需要爲您的站點使用SSL證書(如果使用WSHttpBinding)。

更新:下面是一個示例,Custom Secure Metadata Endpoint演示瞭如何使用安全的元數據端點實現服務。

+0

這不允許某些用戶調用您的服務 - 但它不會阻止他們首先添加服務引用。 – 2009-08-07 08:15:20

+1

mex的默認綁定是匿名的mexHttpBinding。您可以更改該綁定以使用像wsHttpBinding這樣的安全綁定。鑑於在確保WSDL和實際服務之間的選擇,我總是希望確保服務的安全。如果服務位於互聯網上,即使您不公開WSDL,也可以通過嗅探線路來確定您的服務接口。 – 2009-08-08 02:44:02

相關問題