第四步:
WCF安全問題探討。以及如何使用“服務跟蹤查詢器”工具。
WCF程式有更多的安全問題,因為訊息需要跨越機器邊界傳遞,對訊息進行加密是一方面,帶簽名是另一種方式。通常WCF包括傳輸通道和訊息層級的安全性。如https就是具有更高安全性的傳輸專用通道,訊息層級包括加密和解密等。
一、訊息層級的TCP服務保護
樣本:NetTcpBinding綁定的訊息加密。宿主程式和用戶端的設定檔中分別增加
<netTcpBinding>
<binding name="ProductsClientTcpBindingConfig">
<security mode="Message">
<message algorithmSuite="Basic128" />
</security>
</binding>
</netTcpBinding>
然後修改binding=netTcpBinding的endpoint指定bindingConfiguration屬性=tcpBindingConfig,這樣這種綁定的訊息會自動進行加密和解密。這樣可以通過service trace viewer工具查看D:\project\LS.PRJ2011\ProductsServiceHost\ProductsService.svclog(這個地址在你本機可能需要修改)這個檔案來觀察訊息是否真正的被加密了。
基本BasicHttpBinding綁定的訊息加密需要認證,比較麻煩,但WSHttpBinding綁定的訊息加密預設就會有訊息加密功能,所以只要提供一個WSHttpBinding的endpoint就OK。
二、在傳輸通道層級保護一個HTTP服務
我提到過,傳輸通道的保護可以配置為https來增強保護,由於啟用https需要認證檔案,比較麻煩。暫時不示範了,後面有時間再補充吧。
三、認證與授權
認證和授權是基本form驗證的一種有效方式,也是在web程式中用的最多的一種驗證方式。WCF對認證和授權有了很好的支援,這個主題也很廣泛,這裡只是簡單示範伺服器端怎麼樣拿到用戶端的windows使用者名稱。
面來實踐一下Microsoft Service Trace Viewer這個WCF工具是如何耍的(下面的項目都是基於在前面的執行個體)
開啟ProductsServiceHost項目,右鍵app.config->編輯WCF配置->診斷->訊息日誌記錄。把LogEntireMessage,LogMessagesAtServiceLevel,LogMessagesAtTransportLevel屬性設為True。
診斷->源->建立源。名稱:System.ServiceModel.MessageLogging;層級:Verbose。
診斷->接聽程式->建立接聽程式。InitData:D:\project\LS.PRJ2011\ProductsServiceHost\ProductsService.svclog;Name:MessageLog;源:(添加)System.ServiceModel.MessageLogging。
ok,使用Microsoft Service Trace Viewer的前提配置就搞定。把檔案D:\project\LS.PRJ2011\ProductsServiceHost\ProductsService.svclog開啟就可以跟蹤訊息。
在這裡,我是想一探訊息層級的加密機制是怎麼個回事。那麼還得做些設定。
綁定->建立綁定配置。Name:ProductsServiceTcpBindingConfig;->安全性。Mode:Message;AlgorithmSuite:Basic128;MessageClientCredentialType:Windows並且將bindingConfiguration="ProductsServiceTcpBindingConfig"
對於用戶端項目ProductsClient,建立綁定ProductsClientTcpBindingConfig,其他配置與服務端一樣。