2011-05-02 44 views
0

這裏是我的情況和問題:WCF - Encyrption(以及可能的身份驗證),使用SSL

  • 我們有一個Windows 2008 R2服務器(IIS7)
  • SSL認證
  • .NET 4

我試過在網上尋找一個很好的資源,但其中大部分都是不完整的,而且彼此之間的差異足夠大,所以他們並不真正混合搭配。我正在尋找使用WCF服務從我的客戶端/服務器加密傳遞消息。我打算實施一些自定義認證方案。認證方案將驗證用戶/通過第一次認證。然後,客戶端將使用隨機生成的代碼作爲他們的身份驗證。

從我所收集我需要做到以下幾點:

  • [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
  • 使用WsHttpBinding的

在此處,我有點不知所措。有很多來源說明如何配置文件的服務器和客戶端應該是我只是非常困惑。我的服務器/客戶端配置文件應該是什麼樣子,以便我的服務發送/接收加密的消息並可以指向自定義身份驗證?或者,如果我不能使用此自定義身份驗證作爲WCF客戶端對象的參數,則只要將身份驗證憑據作爲消息本身的一部分傳遞,只要該消息是加密的即可。

如果有一個實際的完全完整的(即不是部分信息)資源,那就太好了。或者,如果有人知道必要的客戶機/服務器App.config/Web.config設置使用,那也很棒。

回答

0

我相信你想使用HTTPS來確保傳輸級別的加密和簽名。您需要首先使用SSL證書配置IIS7.5,並在託管該服務的應用程序中允許https。檢查this tutorial但您將使用您的現有證書,而不是創建自簽名。應爲您的站點的主機標頭(例如mydomain.com)或您的服務器的名稱(如果直接暴露)創建證書。

在您的服務中,您需要具有傳輸安全性和消息憑證的basicHttpBinding以進行身份​​驗證。

<bindings> 
    <basicHttpBinding> 
    <binding name="secured"> 
     <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="securedService"> 
    <serviceMetadata httpsGetEnabled="true" /> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" userNamePasswordValidator="..." /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service name="..." behaviorConfiguration="securedService"> 
    <endpoint address="" contract="..." binding="basicHttpBinding" bindingConfiguration="secured" /> 
    <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpsBinding" /> 
    </service> 
</services> 

客戶將使用類似的設置:

<bindings> 
    <basicHttpBinding> 
    <binding name="secured"> 
     <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint name="..." address="https://..." contract="..." binding="basicHttpBinding" bindingConfiguration="secured" /> 
</client> 

該構成,構成SOAP 1.1服務符合固定在HTTPS傳輸,並通過用戶名和密碼保護。服務還通過HTTPS公開其元數據(WSDL)。用戶名和密碼由自定義密碼驗證器進行驗證(您必須implement one)。

您將設置客戶端憑證(通過添加服務引用生成):

var client = new MyServiceClient(); 
client.ClientCredentials.UserName.UserName = "Name"; 
client.CleintCredentials.UserName.Password = "Password"; 

信息的加密傳輸層上完成的。每次創建新代理時都必須配置證書,但是它們可以重用於來自代理的所有呼叫。恐怕不是您的方案需要

WsHttpBinding的。設置ProtectionLevel僅用於消息級別的安全 - 我認爲這不是你正在尋找的。

不要用你描述自定義身份驗證:

驗證方案將驗證 用戶名/密碼在第一次 認證。然後從那麼 客戶機上將使用隨機生成的 代碼作爲其身份驗證。

這要複雜得多。您將推出自己的解決方案,這將是非標準的,或者您將使用WCF的內置實現(安全對話),但並非每個客戶端SOAP堆棧都能夠使用此類服務​​(它完全依賴於高級消息安全性)。

+0

我不需要使用WSHttpBinding,因爲它對郵件進行加密而不是以明文形式發送:''您必須注意的一個最大的區別是安全方面。默認情況下,BasicHttpBinding以純文本形式發送數據,而WsHttpBinding將它在加密和保護的方式「'(http://www.codeproject.com/KB/WCF/HttpBinding.aspx) – michael 2011-05-02 20:25:45

+0

**默認情況下**,但我不使用默認配置 - 我創建的自定義配置basicHttpBidning使用運輸安全。 – 2011-05-02 20:30:13