2010-09-20 73 views
3

在我的WCF服務類,我在設置當前主要是在消息的頭通過主體的構造函數:WCF服務 - 自定義用戶

Thread.CurrentPrincipal = OperationContext.Current.IncomingMessageHeaders.GetHeader<BBPrincipal>("bbPrincipal", "ns"); 

這似乎是工作正常,但是當我在一個方法中引用主體時,Thread.CurrentPrincipal已經恢復爲WindowsPrincipal。

推測該方法是在不同的線程上觸發。我如何確保該方法在服務的構造函數中使用主體集?

+1

你需要解釋什麼是你想達到的目標。你想在另一個帳戶/模擬下運行你的服務嗎?當然,處理傳入請求的線程將與創建服務的線程不同。 – Aliostad 2010-09-20 09:17:52

+0

你在哪裏執行這段代碼:「將當前主體設置爲在消息頭部傳遞的主體的主體」 - 我非常感興趣,因爲我有類似的問題。 – 2014-08-12 03:23:42

回答

7

我剛剛找到了我原來的問題的答案。爲了阻止WCF爲空白覆蓋本金,設置行爲的配置如下:

<serviceAuthorization principalPermissionMode="None" /> 

這麼簡單,也不需要做出徹底改變現有的代碼庫。

請參見:http://connect.microsoft.com/VisualStudio/feedback/details/369445/wcf-service-configured-for-transport-security-shouldnt-change-thread-currentprincipal

+0

我也這麼做了,謝謝!我嘗試設置主體,同時驗證用戶憑證(在UserNamePasswordValidator中),並可以在我的服務中檢索它。 無論如何,我想知道你是否經歷過一些神祕的問題,因爲每個人(和MS文檔)都說:「在自定義授權策略中設置你的主體」。 Tnx再次提前。 – 2012-09-09 18:15:47

+0

正是我在找的,謝謝! – 2013-08-06 09:16:58

4

WCF總是在AuthorizationPolicy中設置主體,以便它可能會覆蓋您的更改。您應該執行custom authorization policy並在那裏設置主管。

+0

對於principalPermissionMode =「Custom」+1。另一個有用的例子是[OAuthResourceServer]的DotNetOpenAuth示例代碼(https://github.com/DotNetOpenAuth/DotNetOpenAuth/tree/master/samples/OAuthResourceServer/Code) – 2012-10-05 06:15:45