2009-09-15 58 views
7

我有一些安全區域內的客戶正在使用的服務。我被要求保護這些服務,通常是針對開發客戶錯誤地連接到錯誤的服務。如何使用共享密鑰限制對WCF服務的訪問

這個想法是爲客戶端和服務主機的配置中設置的預共享密鑰(如guid)。每當客戶端嘗試使用該服務時,它都必須提供正確的密鑰。

我該如何去配置一個服務來實現這種安全?多少定製是必要的?

回答

0

如果您使用密鑰進行操作,則需要更改該服務的合約以包含該密鑰將放置的字段。然後檢查服務器端密鑰中的值。

但是,在你的情況下,你可以通過網絡配置限制哪些IP地址被允許訪問服務。這比改變服務簽名的工作要少。

+0

這是不是一個好主意 - 這樣,你必須改變你的合同,你「污染你的實際業務邏輯與基礎設施/轉向領域。我不會推薦這種方法。 – 2009-09-15 11:25:01

2

我希望客戶端將密鑰作爲額外的消息頭髮送,並創建一個IDispatchMessageInspector以檢查頭並有選擇地拒絕它。 This代碼項目文章描述了基於IP地址的過濾器部分。

+0

謝謝,我喜歡這種方法的外觀。我已經完成了一些關於這個想法的研究,看起來我應該使用IClientMessageInspector在客戶端插入密鑰 - 作爲端點行爲來實現。 然後在服務器端,我將有一個實現IDispatchMessageInspector的行爲來檢查密鑰。 最後一件事 - 是否有任何現成的wcf可以實現類似的目標,但不需要定製行爲? – Columbo 2009-09-15 11:49:37

+0

如果您不使用WCF安全功能,則可以將其用於此方法。在這種情況下,我會爲每個客戶端應用程序創建一個證書,並在每個服務檢查中爲允許的客戶端證書創建證書我想你可以用用戶名/密碼做同樣的事情,儘管這也會迫使你使用HTTPS。 – Maurice 2009-09-15 11:54:56

+0

謝謝,用戶/通過認證是我們之前考慮的事情,但我們對ssl和我們的網絡配置有一些問題,這意味着我們開始尋找滿足要求的其他方式。 從我今天所瞭解到的情況來看,我想我會使用這種在頭部發送共享密鑰的方法。所以現在只是做一個小測試項目:) – Columbo 2009-09-15 12:11:18

3

您可以輕鬆地爲每個呼叫添加自定義消息標頭 - 實際上很容易,而且不會「污染」您的實際服務合同,例如,你不必爲你的服務調用添加額外的參數來傳遞它。

參見如何實現這一目標,這些文章的信息:

基本上,你需要你的電話換到服務於一體的的OperationContext - 就是這樣,沒有ClientMessageInspector和其他需要的欺騙:-)

using (OperationContextScope scope = new OperationContextScope(proxy)) 
{ 
    Guid myToken = Guid.NewGuid(); 

    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken); 
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns"); 

    OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 

    proxy.DoOperation(...); 
    } 

,並在服務器端,你可以簡單地檢查IncomingMessageHeaders集合:

Guid myToken = OperationContext.Current. 
       IncomingMessageHeaders.GetHeader<Guid>("token", "ns"); 

馬克

+0

嗨馬克,假設科倫坡沒有配置服務的其他安全,這個解決方案仍然會導致WCF消息內容被加密? – Xiaofu 2012-03-09 03:31:10

+0

@Xiaofu:默認情況下(除非你明確地關閉它),**所有** WCF消息都被加密並進行數字簽名。 – 2012-03-09 05:55:56