2012-05-18 34 views
4

我正在開發基於TcpClient/TcpListener的客戶端 - 服務器應用程序。 現在我已經到了需要認證用戶的地步。我可以在服務器端使用PrincipalContext-Class並從客戶端請求用戶名/密碼/域,但我不想通過網絡發送憑據。此外,我不想問用戶的憑據再次。因此,我知道支持傳遞身份驗證的Citrix Receiver。它使用當前登錄的用戶,並且不請求任何憑據並根據服務器對用戶進行身份驗證。它只是工作。在C#中實現傳遞身份驗證

如何在我的應用程序中執行此操作?我想過可以發送到服務器的某種令牌,但我找不到任何解決方案。

+1

我不知道思傑如何影響這種情況,但它聽起來像是Windows模擬的候選人。在[NegotiateStream](http://msdn.microsoft.com/en-us/library/system.net.security.negotiatestream.aspx)中打包通信並調用適當的'AuthenticateAs ...'方法應讓客戶端指定想要允許的模擬級別,服務器使用流上的RemoteIdentity屬性模擬客戶端。 – shambulator

+0

聽起來不錯。你可以發佈這個答案。這顯然是做到這一點的方法。這很簡單。謝謝! – nikeee

回答

2

包裹的NetworkStream在NegotiateStream,並調用客戶端和服務器上的相應NegotiateAs...方法。

客戶端可以指定允許的模擬級別,服務器可以指定它需要的級別(最低限度爲Identification以確定客戶端身份,但是如果您需要以客戶端身份訪問本地或網絡資源,也可以指定Impersonation或使用正確的網絡配置,Delegation)。

一旦通過身份驗證,服務器就可以使用NegotiateStream的RemoteIdentity屬性確定客戶端的身份和/或模擬。

正如我在我的評論中提到的,我不知道Citrix如何影響此設置(從未使用它),但如果它對於應用程序基本上是完全透明的,並且所有內容都使用標準的Windows憑據,那麼這應該起作用。

0

如果您正在編寫應用程序的客戶端和服務器部分,那麼您可以加密用戶的憑據以通過網絡傳遞並在另一端解密。

假設在客戶端計算機上,惡意用戶可以從應用程序中提取加密密鑰(使用strings或類似的方法),則對稱加密不適用。因此,不對稱(公共 - 私人)加密似乎是合適的。生成一對密鑰,並且服務器的密鑰應該保持私密(並且只能在服務器上),並且客戶機的密鑰可以包含在客戶機上的應用程序中。然後,無論是否從應用中提取密鑰都不重要,因爲憑據只能使用服務器上的祕密和安全私鑰解密。 This class已經爲你做了大部分地面工作。

+0

我不想使用任何**憑證。我希望我的客戶端應用程序獲取當前登錄的用戶並通過身份驗證,以便用戶可以自動登錄而不會提示任何憑據。這是可能的,但我不知道如何。 – nikeee