2011-06-01 106 views
9

我正在分析幾個月前離開公司的一位同事做的一箇舊的asp.net網站的問題。在asp.net網站上混淆的會話

問題是我們有幾次已經確定兩個用戶會話混在一起,所以如果例如兩個用戶登錄,一個用戶會看到其他用戶的數據。由於很少發生(大約一個月左右),因此很難弄清楚哪裏出了問題。

現在我已經通過他的認證碼加強,它是這樣的:

  1. 用戶公共頁面並按下輸入用戶名/密碼在MySQL提交
  2. Page_Load在母版的代碼檢查數據庫的用戶名/密碼是有效的,沒有過期等,並返回一個唯一的用戶ID,如果確定
  3. 頁上,然後保存在這樣的會議上loginpage(用於以後的註銷): HttpContext.Current.Session(Consts.CCookieName_LoginUrl) = Request.RawUrl
  4. 然後,將用戶ID被保存這樣的:FormsAuthentication.SetAuthCookie(userid, False)
  5. 然後,執行重定向到安全區域:userid = Context.User.Identity.Name
  6. 用戶數據被加載acording:Context.Response.Redirect(secureurl, False)
  7. 在安全區域的母版的Page_Init用戶標識是通過讀到用戶ID
  8. 用戶導航安全區域,即。步驟6 - 7重複
  9. 用戶suddently看到其他用戶的數據

我有什麼錯誤的一些想法,但想有一些輸入修改代碼之前,所以請人?

+0

我們也使用asp.net表單身份驗證,並且很少有這方面的報告,我們永遠無法重現問題並不幸地進行調試。我希望有人可以添加更有用的東西。 – 2011-06-23 03:42:24

+1

看看這個公認的答案:http://stackoverflow.com/questions/6441182/aspx-global-instance-of-class-possible-bug-in-code-structure/6441357#6441357我相信這解決了我們的問題 – Muleskinner 2011-06-23 07:08:48

+0

你使用任何類型的緩存? – 2011-06-25 11:51:30

回答

6

這裏很難說。 你配置了表單身份驗證嗎?

這是你必須遵循的窗體身份驗證過程: 在你的web.config您設置的認證系統:

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" defaultUrl="Home.aspx" timeout="30" slidingExpiration="true" /> 
</authentication> 

<authorization> 
    <deny users="?"/> 
</authorization> 

你的登錄頁面(後回)檢查憑證(不是你的主人頁)。 如果用戶是有效的,那麼你設置Cookie:

FormsAuthentication.SetAuthCookie(用戶ID,FALSE)

,並重定向到另一頁。 現在,你必須設置你的本金在這裏讀的cookie:顯然

protected void Application_AuthenticateRequest(Object sender, EventArgs e) { 
    if (HttpContext.Current.User != null) { 
     if (Request.IsAuthenticated == true) {  
      // Debug#1    
      FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value); 
      // In this case, ticket.UserData = "Admin"     
      string[] roles = new string[1] { ticket.UserData }; 
      FormsIdentity id = new FormsIdentity(ticket); 
      Context.User = new System.Security.Principal.GenericPrincipal(id, roles); 
      // Debug#2 
     } 
    } 
} 

,我已經簡化,但是這是你必須遵循正確做事的路徑。

+0

非常感謝,根據您的輸入清理了我的代碼(不要相信它解決了具體問題然而)。 – Muleskinner 2011-06-23 07:12:03

+0

@Muleskinner:沒問題。我很高興能以某種方式提供幫助。要解決您的特定代碼,我可能需要查看代碼。另一件事我忘了。你必須設置Thread.CurrentPrincipal = HttpContext.Current.User Xhalent在這裏建議:http://stackoverflow.com/questions/6043100/asp-net-mvc-and-windows-authentication-with-custom-roles – LeftyX 2011-06-23 12:33:44

4

我會尋找任何不應該是靜態的靜態(並跨線程/請求共享東西)。

也許它根本不是認證相關的。您是否嘗試將Context.User.Identity.Name值與錯誤的數據結果一起進行傾銷?它是否也會返回錯誤的用戶名?

當您可以保證只有一個用戶在網站上處於活動狀態時,您能否重現該問題?