2009-10-21 81 views
2

我一直在嘗試獲取ASP.NET MVC中的成員資格。有些頁面需要認證。其他人可以有客人和授權的成員。很像StackOverflow。他們可以匿名或作爲註冊用戶進行操作。爲ASP.NET MVC實現自動登錄

我們還有一個處理成員的自定義數據庫模式(不是默認的ASP.NET Membership方式)。所以我會考慮寫我自己的會員/主席代碼。到目前爲止,它的運行良好,但是我遇到了會話過期和能夠實現「記住我」功能的問題。

我使用FormsAuthentication.SetAuthCookie(username,rememberMe)來設置表單cookie,但說用戶離開機器20分鐘或IIS回收我的會話死亡,並且我得到一個非常不一致的用戶狀態。

我在哪裏可以看到'記住我'Cookie,並且如何處理用戶再次登錄?基本上我會存儲用戶名和密碼,然後在Application_BeginRequest或其他東西中查找cookie嗎?

回答

4

如果我正確地閱讀了您的話,您似乎期待ASP.NET檢測到持久性身份驗證Cookie並重新建立該用戶的上次會話狀態。它不會這樣工作:身份驗證cookie和asp.net會話是兩個獨立的事情,所以確實會有用戶返回該站點並通過持久性AuthCookie傳遞身份驗證的實例,但具有全新(空)會話數據。

假設AuthCookie設置正確,您可以檢測到用戶使用User.Identity.IsAuthenticated進行了身份驗證,但不受IIS回收或會話過期的影響。用戶名在User.Identity.Name中公開。

如果您需要在用戶返回網站時重新初始化某些會話數據,則必須手動執行此操作。如果這真的是你問的問題,那麼在不瞭解更多關於你的應用的情況下很難回答,但考慮global.asax中的Session_StartSession_End事件。或者你可以只空檢查會話對象和重新填充時,它是空的(會話過期了之後),例如:

//get some user info from session or db if session is null 
string preferredName; 
if (User.Identity.IsAuthenticated) 
{ 
    object o = Session["preferredName"]; 
    if (o == null) 
    { 
     preferredName = repository.GetUser(User.Identity.Name).PreferredName; 
     Session["preferredName"] = preferredName; //save to session so this isn't necessary next time 
    } 
    else 
    { 
     preferredName = (string)o; 
    } 
} 
else 
{ 
    preferredName = "anon"; 
} 
+2

只是知道有session_end-的cavets當會話狀態是不工作存儲在SQL服務器上,例如 – RichardOD 2009-10-21 17:42:57

+0

好點!我將其納入了全面披露的利益,但我也會避免在session_end中做太多或任何事情。 – 2009-10-21 17:50:44