我有一个.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