我有一個.aspx頁面,其中包含一個<asp:Login>
Web控件。ASP登錄Web控件事件不像預期的那樣
對於身份驗證,我有另一個類(MyMembershipProvider
),它繼承了System.Web.Security.MembershipProvider
類。
登錄過程工作正常 - 即用戶名/密碼由MyMembershipProvider
對象正確驗證。
我的問題是關於設置System.Web.SessionState.HttpSessionState.Session
變量。
用戶成功通過驗證後(通過MyMembershipProvider
類),我想爲該用戶創建自定義Session
變量。
起初,我以爲我會可以設置在<asp:Login>
控制的LoggedIn
事件處理Session
變量 - 是這樣的:
protected void LoginUser_LoggedIn(object sender, EventArgs e)
{
//Get the UserName of the authenticated user
string userName = Thread.CurrentPrincipal.Identity.Name;
//Call the business layer to get more info on the authenticated user
Entities.User user = BizLayer.GetUser(userName);
//Set session vars for the authenticated user
Session["LastName"] = user.LastName;
Session["FirstName"] = user.FirstName;
Session["Email"] = user.Email;
}
,我注意到的問題是,當LoggedIn
事件被觸發Thread.CurrentPrincipal.Identity.Name
尚未設置爲用戶登錄時使用的用戶名。因此,對BizLayer.GetUser()
的調用返回一個空的User
對象,這當然會導致Session
設置器無用。
我的猜測是,由於我使用的是自定義的MembershipProvider
,該<asp:Login>
事件處理程序(LoggedIn
,Authenticated
,LoggingIn
)不工作,因爲我他們期待。
是否有另一個事件處理程序,我應該用它來設置Session
變量?或者,你能否指出我能夠完成我所描述的同樣事情的正確方向?
直到我聽到一個更好的辦法,我已經實現了以下內容:
我改變了<asp:Login>
控制的DestinationPageUrl
屬性指向一個網頁,會做設置Session
瓦爾的工作。然後,在設置Session
變量後,我打電話Response.Redirect()
轉到以前在DestinationPageUrl
屬性中設置的頁面。
相關的代碼看起來是這樣的:
的Login.aspx網頁具有類似於登錄控制...
<asp:Login ID="LoginUser" runat="server" DestinationPageUrl="SetSessionVars.aspx">
SetSessionVars.aspx網頁都有設置會話瓦爾的方法並重定向用戶到一些網頁...
protected void Page_Load(object sender, EventArgs e)
{
this.SetSessionVars();
Response.Redirect("foo.aspx");
}
private void SetSessionVars()
{
//Get the UserName of the authenticated user
string userName = Thread.CurrentPrincipal.Identity.Name;
//Call the business layer to get more info on the authenticated user
Entities.User user = BizLayer.GetUser(userName);
//Set session vars for the authenticated user
Session["UserId"] = user.UserId;
Session["LastName"] = user.LastName;
Session["FirstName"] = user.FirstName;
Session["Email"] = user.Email;
}
我覺得最好使用.Identity.Name,因爲它是保證用戶名已被biz層(MembershipProvider)認證。即,在我的方案中,如果用戶未經過身份驗證,則無需設置會話變量。 – Jed 2010-11-01 15:51:31
不夠公平,請參閱編輯。 – 2010-11-02 22:23:47