2011-06-30 39 views
1

我想在用戶登錄時執行下面的行,以便我可以訪問MembershipUser對象。不過,我很難搞清楚什麼時候設置它。ASP.NET MVC,表單身份驗證和會話

Session["User"] = Membership.GetUser(); 

到目前爲止,我已經試過......

  • Application_AcquireRequestState
  • 的Application_BeginRequest
  • FormsAuthentication_OnAuthenticate

對於每個會話狀態不一定可用。

手動在登錄頁面調用它很容易,但我需要在使用cookie自動登錄時使其工作。

回答

3

如果你想要做的是存儲任意數據與用戶名一起,有一個名爲FormsAuthenticationExtensions一個開源項目,可以讓您精確地做到這一點非常簡單的方式:

在你的登錄操作您將存儲你的數據是這樣的:

var ticketData = new NameValueCollection 
{ 
    { "name", user.FullName }, 
    { "emailAddress", user.EmailAddress } 
}; 
new FormsAuthentication().SetAuthCookie(user.UserId, true, ticketData); 

而且你讀回這樣的:

var ticketData = ((FormsIdentity) User.Identity).Ticket.GetStructuredUserData(); 
var name = ticketData["name"]; 
var emailAddress = ticketData["emailAddress"]; 

數據存儲在相同的cookie持身份驗證票證,所以這將是可用的,只要用戶登錄

項目頁面:http://formsauthext.codeplex.com/

的NuGet:http://nuget.org/List/Packages/FormsAuthenticationExtensions

1

爲什麼?您可以從任何地方訪問Membership.GetUser。這是一種靜態方法。在任何地方你可以從任何地方訪問的地方放置一個價值的點是什麼?

+1

,因爲你不」每次你想要顯示用戶的全名時,你都要去數據庫 – Eranga

+1

@Eranga - 我認爲從數據庫中獲得自定義成員資格提供者會更有效率,它很容易做,而且你可以做它一次,然後忘掉它。有幾篇關於如何做到這一點的文章。另一種選擇是創建緩存此數據的CachedMembershipUser包裝器。您使用相同的接口,但需要時轉發給真正的提供者。 –