2008-10-24 86 views
15

我有一個WCF服務已啓動並正在運行,並且能夠使用basicHttpBinding在服務和.Net 2.0客戶端之間進行通信。如何從.Net 2.0調用WCF服務時配置安全性客戶端

我現在需要鎖定WCF服務,以便它只能由經過身份驗證的客戶端調用。

我可以控制將調用我的服務的客戶端。這些客戶端是產品的一部分,將被安裝在野外,並「打電話回家」推送和提取數據。客戶端應用程序是爲.Net 2.0框架編寫的,目前無法升級到3.0或3.5。我無法將Windows用戶帳戶添加到客戶端計算機。

什麼是我的選項來保護WCF服務並能夠從我的.Net 2.0客戶端進行身份驗證?另外,數據需要通過https傳遞。

我一直在尋找網絡,感覺就像我在一個瘋狂的追逐。

回答

0

使用SSL證書是.NET 2.0客戶端訪問WCF服務的唯一選項,因爲basicHttpBinding不提供安全性。通過使用SSL,您可以保護整個傳輸通道。

檢查鏈接http://www.codeplex.com/WCFSecurityGuide/Release/ProjectReleases.aspx?ReleaseId=15892。它涵蓋了涵蓋所有場景的WCF安全。

要獲得免費的SSL證書,請訪問http://www.comodo.com/http://www.instantssl.com/並在您的應用程序中嘗試。

+0

因此,SSL將確保運輸,我明白了。但是,認證呢?我找不到任何人發現它的服務。我可以使用「魔術串」方法,但這並不理想。 – JasonS 2008-10-24 05:13:42

0

您的安全將由ssl覆蓋。

對於身份驗證,您有兩個選項 - 基本(用戶名和密碼)或證書。

Here是一個演示配置證書認證的視頻。

在所配置的basicHttpBinding的的安全元件如下所示:

< basicHttpBinding的>
    <綁定名稱= 「basicHttp」>
        <安全模式= 「TransportWithMessageCredential」 >
            <消息clientCredentialType = 「證書」/>
        < /安全>
    < /結合>
</basicHttpBinding的>

也有這個here一個良好的網頁。谷歌在clientCredentialType,你應該很快找到自己的正確軌道。

用於設置wse *策略文件後面的客戶端證書。

您需要弄清楚您將如何向各個站點提供客戶端證書。這取決於項目的安全問題。有各種各樣的方式(我沒有記得對不起,我上次在大約兩年前做過這樣的事情),所以細節被遺忘了,但它肯定是可能的,花了幾天的實質研究找到一個好方法)。

+0

第二個鏈接無效......它有腳本錯誤,不會讓我查看整篇文章。 – LamonteCristo 2011-04-08 14:06:27

+0

Chrome和IE雖然沒有讓我......我通過主頁登錄,並刷新...沒有運氣。當我剛剛搜索了帶我到這裏的介紹性句子時,它終於奏效:http://www.devx.com/codemag/Article/33342/1763感謝我現在的工作。 – LamonteCristo 2011-04-08 14:42:20

10

您可以配置WCF端點使用雙向SSL認證。這意味着您可以要求客戶出示一張X.509證書,以便在向服務提出請求時確認其身份。

在服務器端,可以使用WCF中的內置驗證方案之一,或者提供自己的驗證邏輯來​​檢查X.509證書。
如果您在IIS中託管服務,那麼將SSL配置爲需要傳輸級別上的客戶端證書是微不足道的。然而,你可以找到關於如何實現自託管的WCF服務在這裏這種行爲有很好的指導:

http://leastprivilege.com/2007/08/25/certificate-based-authentication-and-wcf-message-security/

我還沒試過此我自己,但是,因爲這將創建在安全要求消息級別,我認爲您必須使用wsHttpBinding在您的WSDL合約中強制執行它,因爲強制訪問Web服務的安全要求是WS- *標準的一部分。

如果你必須使用basicHttpBinding的,你可以試試這個方法,而不是說在傳輸層移動的事情了:

http://leastprivilege.com/2007/08/26/certificate-based-authentication-and-wcf-mode-independent/

希望這有助於

4

行,所以,使用SSL你有運輸級別的安全;這很好,可以保護消息免受嗅探和改變。

所以現在你有選擇;你需要驗證才能保持沉默,或者當你的程序啓動時你能提示用戶輸入用戶名/密碼嗎?如果它必須保持沉默,那麼你可以像上面提到的那樣使用客戶端證書(雖然這很痛苦,但你需要自己生成證書並驗證它們,所以你需要考慮運行你自己的證書頒發機構)。或者,您可以在包含客戶端ID的消息中嵌入自定義標題,並以kludgey的方式執行此操作。

如果您可以提示輸入用戶名和密碼,那麼您可以使用custom authenticator或甚至使用ASP.NET membership database來驗證該方式並將其插入數據庫查找。

1

這裏是我最終做這似乎是在我們的情況最簡單的解決方案,這是非常小的規模僅露出少數的網絡服務:

  1. 採用SSL安全傳輸
  2. 客戶首先通過調用Web服務上的登錄方法登錄到Web服務。如果登錄成功,則會向客戶端返回一個加密的FormsAuthenticationTicket。
  3. 客戶端必須隨每個Web服務調用提供表單身份驗證票證。每種方法都會檢查票證是否有效,如果是,它會執行其工作。如果故障單已過期或無效,則客戶機必須重新進行認證。

希望幫助別人......