2010-08-24 70 views
0

我正在使用自定義的UserNamePasswordValidator,它實例化並登錄到我們的內部API。使用自定義的UserNamePasswordValidator,我可以殺死用戶的WPF「會話」嗎?

這個API公開了一個事件,當用戶被「踢」(被另一個管理用戶)觸發時,我想通過殺死WCF會話來響應這個事件,以便進一步的調用引發異常。

我該如何去做這件事?

我的WCF服務託管在Windows服務(不是IIS)中。實例化並登錄到內部API需要相當長的時間,所以我不能在每次服務調用時都這樣做。

回答

0

我在http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx發現了一些代碼,它顯示瞭如何使用自定義的ServiceCredentials類,並從那裏將用戶的詳細信息一直傳遞到Thread.CurrentPrinciple

從那段代碼開始,我將Connection對象存儲在自定義主體對象中,這意味着我可以在會話上下文中找到它。然後,我添加了一個自定義CodeAccessSecurityAttribute,檢查該連接對象是否已斷開連接。如果有,會拋出異常,從而殺死用戶的會話。

0

如果您希望服務使用用戶名和密碼驗證每個用戶的呼叫,那麼您的驗證器中可以有任何代碼。但是,如果您期望使用每個會話服務實例,您可能還會使用安全上下文(安全會話)。在這種情況下,只有第一個請求由驗證程序驗證,並且後續請求通過在建立安全上下文期間生成的令牌進行驗證。

編輯:

每個運行服務由的InstanceContext類表示。如果您有PerSession服務,則InstanceContext對於每個調用都是相同的。如果你存儲對InstanceContext的引用,你應該能夠釋放實例並關閉會話 - 我從來沒有嘗試過,但它應該是可能的。

+0

我使用每會話實例,因爲登錄到我們的API是昂貴的。問題依然存在:我如何撤消會話? – 2010-08-24 09:23:59

+0

你使用哪種綁定? PerSession實例依賴於其他會話類型 - 傳輸,安全性或可靠性。 – 2010-08-24 09:46:59

+0

無論我需要什麼綁定:我控制客戶端和服務器。 – 2010-08-24 10:10:46