2015-01-09 58 views
1

當創建一個WCF服務應用程序時,我實現了UserNamePassValidator以進行自定義認證,並且按預期工作。WCF單一認證多端點

但由於大量的服務功能,我已經分離到這個不同的服務合同,如庫存管理服務,位置管理服務,任務管理服務等,然後我暴露了這些不同的同一服務中的端點。

這似乎很好地工作,但我寧願是一個端點認證和跨所有端點保持這種會話狀態。目前發生的事情是我對一個身份驗證,然後我可以訪問該服務合同的功能,但如果我要連接到另一個終端,則需要我再次進行身份驗證。

我目前的柺杖解決方案是在客戶端的表單之間傳遞ClientCredentials以進行身份​​驗證,雖然它使用了Message安全性,所以它們通過電纜加密,但顯然這不是一個理想的解決方案。

第一部分是否有解決方案?如果不是,在客戶端將用戶輸入的憑證存儲在內存中(運行時)的最佳做法是什麼?

回答

3

您可以實施類似於WS-Federation的方案。這是一種服務級別的聯合安全。

  • 首先,您的驗證端點應該叫STS(安全 令牌服務)。它所做的是身份驗證,並向客戶端返回一個安全 令牌。

  • 其次,STS應該由所有的服務端點是可信的。當 調用端點你應該通過在STS 設置爲使得終端將能夠讀取該令牌和 認識到,令牌是由受信任的STS頒發的安全令牌。

我已經實現了一個與Thinktecture在https://github.com/khoanguyen/Test-WS-Federation,但遺憾的是我沒有給你解釋將需要研究有關WS-聯邦和Thinktecture和WIF一點點。但你應該知道這是可能的。


,我使用的移動項目REST服務的一個輕量級的解決方案是如下:

  • 我成立了一個身份驗證的端點。該端點持有DSA私鑰/公鑰對。當客戶端通過身份驗證時,此端點將生成一個令牌並使用DSA私鑰對其進行簽名。然後,我將簽名和令牌組合在一起,並將其作爲安全令牌返回給客戶端。

  • 在服務端點,我給他們的DSA公共密鑰(從密鑰對身份驗證的端點)。 DSA公鑰用於驗證安全令牌。

  • 當客戶撥打服務端點,它重視安全令牌作爲HTTP消息的頭中。然後,服務端點讀取頭部以檢索安全令牌 - >從安全令牌中提取令牌和簽名 - >使用DSA public來驗證它。

生成令牌的策略取決於您的需要。在我的情況下,我的令牌包含客戶端的用戶名,到期時間戳。通過使用DSA,黑客可以提取所有令牌的數據,但不能更改它,因爲它們必須具有DSA私鑰才能簽署更改的令牌。我們的工作就是保密私鑰,不要在令牌中留下任何敏感信息(例如密碼)。

這是非常便宜的方法。我不需要訪問數據庫來驗證用戶,只需確保獲得有效的安全令牌,令牌的數據僅用於額外的需求,您甚至可以生成隨機令牌並對其進行簽名。不需要會話狀態。