2010-02-09 85 views
0

在我們的應用程序中,我們需要用戶「冒充」不同的用戶。把它看成是一個層次結構 - 鮑勃在層次結構中高於弗蘭克。 Bob已登錄,他需要在系統中短時間內處理Frank的內容。因此,我們向Bob提供了向他彙報的用戶列表以及模擬鏈接。他點擊這個鏈接,在幕後,我將Bob註銷,並以弗蘭克登錄。我還設置了一個會話變量,告訴我真的Bob是誰,是誰的用戶。另外,鮑勃(現在扮演弗蘭克)在每頁頂部都有一個很好的小鏈接,上面寫着「停止模仿」。另外,當鮑勃扮演弗蘭克時,鮑勃被限制做某些事情,比如改變弗蘭克的密碼。ASP.Net會員服務

這很好,直到我們遇到了一個情況,如果會話(我認爲 - 在這裏變得困惑)被破壞(比如當我將新代碼和dll複製到活動站點時),那麼當Bob點擊「停止模擬」他被重定向到默認頁面,並且仍然以Frank身份登錄,但沒有模擬會話變量。所以,現在Bob真的以Frank身份登錄,並且可以更改Frank的密碼(等等)。

是什麼讓一個會話變量(模擬)被摧毀,但我猜會話還在閒逛,因爲它不會使用戶再次登錄?

這是我們的系統是如何工作的有些嚴重的錯誤(在我們的代碼錯誤,我敢肯定,沒有.NET)。有沒有人對此有任何解決方案的建議?

我們正在使用ASP.Net C#,ASPNET會員服務,.NET 3.5,窗體身份驗證...不知道你需要知道什麼。

編輯:更新的信息。看起來像什麼時候發生了「某些事情」,例如,當我重新編譯一些dll並將它們複製到網絡服務器時,會話被轉儲。或者,相反,會話中的變量會被拋棄。會話ID保持不變。我確實需要檢查Session.IsNewSession,它會返回true,即使id與以前相同。

就像Utaal提到的,Membership Services與Session是分開的,所以它的表單auth token仍然在瀏覽器中,但是我的session變量告訴我這不是真正控制瀏覽器的用戶isn'再也不存在了。

編輯:天空,這裏是我正在做什麼來驗證用戶。我想不通,我會插入一張票到這個流程:

if (Membership.ValidateUser(txtUserName.Text, txtPassword.Text)) 
    FormsAuthentication.SetAuthCookie(txtUserName.Text, false); 

所以,我在哪裏可以滑在票據對象,並設置自己的信息?

+0

@matt,已更新。一旦你將頭部纏繞在身上,它確實是一塊蛋糕。瑣碎甚至... – 2010-02-23 05:11:20

回答

3

Matt, 使用表格傳票上的UserData插槽來存儲模擬信息。這就是它的目的。

然後你的信息不會在會話中丟失。

如果您想製作自己的機票的簡單示例,請參閱this。您可能需要關注登錄頁面和tickethelper類。

+0

根據你的建議,我嘗試了這一點,但你不能使用你自己的驗證並自己設置auth cookie並使用它。 「票證」僅在此時讀取。還是)感謝你的建議。 – 2010-02-22 16:17:16

+0

@matt,我不知道我跟着你。根據我的經驗,票據就是您所說的,特別是當您執行自己的驗證時,您有完美的機會在設置票據之前以任何方式構建票據。當你說「在那個時候」你準確地指什麼時候/在哪裏?我只問,因爲我希望看到你得到一個優雅的解決你的問題。我已經讓auth門票做了一些愚蠢的伎倆,給我買了午餐,然後把它們清理出去,然後洗碗。只是說...哈哈。 – 2010-02-22 19:55:40

+0

天空,然後我很困惑。看到我編輯的帖子,我可以告訴你我正在使用的代碼。我真的很想用這張票來做這件事,但我想我在這裏錯過了很多東西。 – 2010-02-23 05:03:52

2

我認爲你的問題是由於窗體身份驗證和會話是兩個不同的東西,而不是相互連接的事實:他們兩個(通常情況下)的使用Cookie,但窗體身份驗證存儲加密直接在cookie中同時登錄的用戶會話在進程中存儲信息(即使您可以更改此行爲)並使用具有會話標識符的cookie來檢索它。

所以,當您的會話信息會丟失(或會話過期),它是不是真的還在閒逛(除了在用戶的PC無效會話cookie)。另一方面,表單身份驗證Cookie仍然有效(ASP.NET會對其進行解密並根據請求對用戶進行身份驗證)。

一個可能的解決方案是檢測創建新會話(使用HttpSessionState.IsNewSession MSDN)並註銷用戶(使用FormsAuthentication)。然後,您可以將用戶重定向到登錄頁面。

+0

感謝Utaal。當我有時間做實驗時,我會在今晚深入一點。 – 2010-02-09 20:16:58