2013-02-06 63 views
3

首先重要的是要注意,在我的應用程序中,如果你註銷會話仍然有效,你不會只是重定向回到登錄頁面,但保持在同一頁面上。爲什麼沒有WebSecurity.Logout *立即*更新IPrincipal.User爲空用戶

隨着中說 - 無論這兩種方式我使用MVC應用程序

FormsAuthentication.SignOut() 
WebSecurity.Logout() 

的效果是一樣的,如果我馬上訪問既不以下性質的變化,以反映註銷退出其中:

User.Identity.Name 
Thread.CurrentPrincipal.Identity 

現在 - 如果我做一個重定向,或只是重新加載頁面那麼顯然這些屬性將更新爲空的用戶。他們並不立即表示User.Identity.Name代表剛剛註銷的用戶。

這是一個問題,因爲我想在登錄/註銷後生成You are logged in as XXX表單的文本 - 而且這可能出現在無法重定向的AJAX情況下。

我很好奇,如果有任何的方式來觸發IPrincipal註銷(或登錄)後自行復位。

我認爲Logout()調用後通常只有Redirect(),所以這從來不是問題,但在AJAX的情況下,這並不總是實際的。

我目前的解決方案是抽象的,我自己的包裝標識,所以一旦我登出我就可以更新。我只是有點擔心,這可能會有一些模糊的副作用,特別是如果有人直接訪問IPrincipal而不是通過包裝。

+0

我真的不明白這裏的問題?爲什麼在使用ajax觸發註銷後會運行更多代碼?接下來的行動將是一個新的要求。 – mattmanser

+0

@matt就是這一點。如果您的意思是重定向(),我不想要「下一個操作」。它不應該是必須的 - 如果'更多的代碼'不會導致500錯誤,auth cookie仍然會被清除。事實上,這個'更多的代碼'是微不足道的,只是返回一些包含'當前用戶'的JSON,但User.Identity返回'舊'用戶。我想最終我沒有看到任何技術原因,爲什麼它不立即清除。我的'包裝'工作得很好,但我只是想了解是否有理由不清除它或者它是一個疏忽。 –

+0

登錄時也是如此 - WebSecurity.CurrentUsername未更新,也不是IPrincipal。我在頁面上有一個可選登錄的購物車頁面。我需要跟蹤e登錄是否成功,而不僅僅依賴於WebSecurity.CurrentUsername –

回答

3

這是ASP.NET事件管道的芯限制,因爲它涉及到表單身份驗證。這也使得它容易受到重播攻擊的影響,如KB article 900111中所述。在那篇文章中,他們引用一種解決方案來使用存儲關於登錄用戶的一些服務器端信息的成員資格提供者。

會員提供商似乎很相似,你想帶的方法,我想知道你是否應該考慮使用內置的會員供應商之一,或編寫自定義代碼爲成員提供。這應該解決一些關於人們不理解方法並直接調用IPrincipal的問題。

您的「註銷但保持在同一頁面」使問題更加突出,但最終您只是發現了每個人都使用ASP.NET的基本重播問題(但並非所有人都解決了這個問題) 。

This related question也可能會有所幫助。