2013-03-18 191 views
1

我完全新的WCF,所以我很抱歉,如果這個問題聽起來很愚蠢..賬戶管理

我想創建這將有賬戶管理的網絡服務。我的意思是我有一個客戶可以請求服務註冊一個新帳戶,登錄並將事情鏈接到我的帳戶。

帳戶存儲在SQL Server數據庫中。

我有這樣的接口:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    bool Register(string username, string password); 
} 

在實現服務的類,新帳戶被輸入到數據庫中。

這是做這件事的正確方法還是我應該以另一種方式做到這一點?另外,安全呢?顯然,密碼將在數據庫中散列(我在方法中創建散列),但以明文形式將其發送到服務似乎不是正確的方式。

第二個問題是,我想使用自定義UserNamePasswordValidator所以客戶端只能調用的方法驗證後(見我剛纔的問題:Basic authentication and WCF

的問題是,我想創建例外:除登記方法外,您必須登錄每種方法。有沒有辦法做到這一點?還是應該爲這一個方法創建一個單獨的服務?

我希望有人能幫助我。

謝謝!

回答

1
  1. 在WCF中,您應該使用傳輸或消息安全來保護您的消息。實現這一點足以讓你確保你的發送密碼。傳輸安全將爲您提供SSL/TSL,而消息安全將根據WS-Security規範保護您的消息。如果你想要,你可以使用它們兩個。請參閱http://msdn.microsoft.com/en-us/library/ms733137.aspx關於消息安全的優缺點以及關於傳輸的http://msdn.microsoft.com/en-us/library/ms729700.aspx

  2. 在啓用您的自定義驗證之前,您必須先執行MUST實現上述安全模型之一。當您實施自定義驗證時,在打開您的頻道之前,這只是另一項安全檢查。例如你有一個代碼自定義的安全

    factory = new ChannelFactory<IContract>(binding, 
           new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(serviceCertificate))); 
    factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; 
    factory.Credentials.UserName.UserName = "admin"; 
    factory.Credentials.UserName.Password = "qwerty"; 
    channel = factory.CreateChannel(); 
    

當您創建這樣的通道,也首次將證書檢查,然後在服務端,它會調用validate()方法。在那裏你可以檢查你的登錄並通過並拋出異常,如果他們錯了。因此,factory.CreateChannel()將返回異常,並且通道不會被構建,因此您將無法調用任何服務方法。如果您只想使用一種方法,我建議您僅使用獨立服務進行註冊,或者您可以嘗試將註冊邏輯放入Validate()方法中。

+0

謝謝,但我不得不把我的註冊方法,因爲你不需要登錄呢?我需要爲這種方法創建一個單獨的服務嗎? – Bv202 2013-03-18 08:57:43

+0

@ Bv202我建議您使用一種註冊方法創建單獨的服務,這種方法無需驗證即可使用,僅用於傳輸安全性,另一種服務使用您的自定義驗證。這將是正確的做法。 – Alex 2013-03-18 09:09:00

+0

好的,謝謝。如果我的客戶無法處理證書怎麼辦?我的客戶端是Windows Phone應用程序.. – Bv202 2013-03-18 09:38:31