2010-10-30 63 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

相关问题