2013-02-20 106 views
10

我在一個非常頭疼的單一生產環境中發生問題。當第二個用戶登錄時,ContextSessionSecurityToken被覆蓋

你有兩個用戶,A和B.用戶A登錄,一切工作正常。用戶B登錄後,用戶B登錄後,用戶A現在具有與用戶B相同的安全令牌。

我們的WIF設置非常標準,我們在令牌上注入了一些自定義聲明,但其他所有內容看起來都是標準的至於如何創建和存儲令牌(由WIF處理)。

覺得我可能會運行到一些奇怪的邊緣情況與WIF,我不熟悉

更新:A和B可以是單獨的機器上,或者在同一臺機器上的獨立瀏覽器。

當我們請求服務時

if (HttpContext.Current == null) 
    return null; 

if (HttpContext.Current.Cache == null) 
    return null; 

if (FederatedAuthentication.SessionAuthenticationModule == null) 
    return null; 

if (FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken == null) 
    return null; 

var sessionToken = FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken; 
if (sessionToken.ClaimsPrincipal == null) 
    throw new InvalidOperationException("The ClaimsPrincipal property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object is null"); 
if (sessionToken.ClaimsPrincipal.Identities == null) 
    throw new InvalidOperationException("The ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object is null"); 
if (sessionToken.ClaimsPrincipal.Identities.Count == 0) 
    throw new InvalidOperationException("The ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object has no identities"); 
if (sessionToken.ClaimsPrincipal.Identities[0] == null) 
    throw new InvalidOperationException("The first identity in the ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object is null"); 
if (sessionToken.ClaimsPrincipal.Identities[0].Claims == null) 
    throw new InvalidOperationException("The first identity in the ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object as a null Claims property"); 

return TokenUtility.GetDelegatedToken(IssuedTokenTypes.UserProfile | IssuedTokenTypes.AccountPermissions, sessionToken); 

如果我添加日誌記錄在這裏我可以看到sessionToken.ClaimsPrincipal.Identity.Name獲得令牌不同於它應該是在這一點上的名字。

+0

你是指在PC上登錄,B使用相同的PC,相同的瀏覽器會話或什麼? – nzpcmad 2013-02-20 18:37:59

+2

如果網站是從兩個不同的機器/瀏覽器瀏覽,則不可能。令牌被張貼到網站並堅持在cookie中。沒有辦法讓用戶共享它,除非你做了一些明顯的錯誤,比如將數據存儲在靜態變量中。 – 2013-02-20 18:39:54

+0

@nzpcmad你可以在同一臺機器上的兩個不同的瀏覽器。你可以在兩臺獨立的機器上。 – jcolebrand 2013-02-20 18:41:11

回答

0

我看到過類似的問題。我們決定改變IIS和代碼上的兌現。兌現導致安全性似乎被搞砸了,但服務器只是存儲了生成的html的最後結果,使得它看起來像用戶A登錄而不是用戶B.希望這有助於一些。

1

您的依賴方和STS(WIF)服務器是否託管在使用相同應用程序池的相同IIS上?如果是,那麼嘗試通過使用不同的應用程序池作爲工作進程有時用來弄亂事情。希望這會幫助你。

0

如果您發佈了關於任何Web配置設置以及IIS配置和.NET Framework版本的其他信息,這將有所幫助。對我來說,這聽起來像是一個應用程序池問題,但對系統知之甚少。如果應用程序池標識是自定義的,那麼當然要訪問同一用戶,除非設置了本地系統或模擬。如果這不是問題,請檢查您的授權設置,並確保無論您的應用程序需要關閉還是禁用基本功能。

相關問題