2010-10-30 47 views
1

我有一個.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>事件處理程序(LoggedInAuthenticatedLoggingIn)不工作,因爲我他們期待。

是否有另一個事件處理程序,我應該用它來設置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; 
} 

回答

1

你爲什麼不只是捕獲從登錄表單的用戶名,而不是從Thread.CurrentPrincipal.Identity得到它的。名稱?

在ASP.NET中這些東西的順序實際上並不直觀,因爲標識在Page_Load之前被加載,然後不會像您期望的那樣在該Logged_In事件中得到更新。

編輯:由於您不喜歡這個,所以在您的業務層中,您將需要添加類似於下面的內容。

var genericIdentity = new System.Security.Principal.GenericIdentity(username); 
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(genericIdentity, roles); 
+0

我覺得最好使用.Identity.Name,因爲它是保證用戶名已被biz層(MembershipProvider)認證。即,在我的方案中,如果用戶未經過身份驗證,則無需設置會話變量。 – Jed 2010-11-01 15:51:31

+0

不夠公平,請參閱編輯。 – 2010-11-02 22:23:47

相關問題