2012-09-16 130 views
2

我有一个使用成员和形式的认证网站:ASP.NET会员登录:用户重定向登录后

ASP.NET页:

<asp:LoginView 
    ID="HeadLoginView" ... 
    <AnonymousTemplate> 
     <asp:Login ID="LoginUser" OnLoggedIn="LoginUser_LoggedIn" ... > 
      <LayoutTemplate> 
       <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Username:</asp:Label> 
       <asp:TextBox ID="UserName" runat="server" CssClass="textEntry"></asp:TextBox> 
       <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label> 
       <asp:TextBox ID="Password" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox> 
       <asp:CheckBox ID="RememberMe" runat="server"/> 
       <asp:Label ID="RememberMeLabel" runat="server" AssociatedControlID="RememberMe" CssClass="inline">Remember me.</asp:Label> 
       <asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Login" style="width:100%; height:35px"/> 
      </LayoutTemplate> 
     </asp:Login>    
    </AnonymousTemplate> 
    ... 
</asp:LoginView> 

后面的代码:

protected void LoginUser_LoggedIn(object sender, EventArgs e) 
{ 
    MembershipUser user = Membership.GetUser(); 
    if (Roles.IsUserInRole(user.UserName, "User")) 
    { 
     // Do something and redirect to user page... 
    } 

    if (Roles.IsUserInRole(user.UserName, "Admin")) 
    { 
     // Do something and redirect to admin page... 
    } 
} 

问题是Membership.GetUser()总是返回null。我试图获得用户名为Page.User.Identity.Name,但它总是空字符串。有没有办法找到当前登录用户的用户名或甚至更好:定义登录后行为<asp:LoginView><asp:Login>

编辑:

MSDN:Login.LoggedIn Event Occurs when the user logs in to the Web site and has been authenticated.link)所以,问题是,为什么认证后的用户Membership.GetUser()返回null?

我的一个同事说,而不是使用Membership.GetUser()使用Membership.GetUser(UserNameTextBox.Text),这是可以的,因为用户进行身份验证使用该用户名,但问题是,我不能找到一个办法让Username.Text。我用findControl()并得到错误。

任何想法?

+0

检查出更新的答案.... –

回答

0

最后我发现基于@LolCoder理念的解决方案:

protected void LoginUser_LoggedIn(object sender, EventArgs e) 
{ 
    String username = (HeadLoginView.FindControl("LoginUser") as Login).UserName; 

    if (Roles.IsUserInRole(username, "User")) 
    { 
     //... 
    } 
    // ... 
} 
2

尝试这样的:

protected void LoginUser_LoggedIn(object sender, EventArgs e) 
{ 
    string userName = (LoginUser.FindControl(“UserName”) as TextBox).Text; 
    //// or use 
    //// string userName = (e.Item.FindControl("UserName") as TextBox).Text; 
    MembershipUser user = Membership.GetUser(userName); 

    if (Roles.IsUserInRole(user.UserName, "User")) 
    { 
     // Do something and redirect to user page... 
    } 

    if (Roles.IsUserInRole(user.UserName, "Admin")) 
    { 
     // Do something and redirect to admin page... 
    } 
} 
+0

我得到这个错误:'名称'LoginUser'在当前上下文中不存在'。页面中对象的层次结构为:LoginView => AnonymousTemplate => Login => LayoutTemplate => TextBox! –

+0

相反,你可以使用e.Item.FindControl(“UserName”)作为文本框..... –

0

我一直使用使用表单验证自己的身份验证。

我重视我写的代码与用户的登录涉及到系统

string role = system.CheckAdminLogin(txtUserName.Text, txtPassword.Text); 
    if (role == Role.admin.ToString() || role == Role.manager.ToString()) 
    { 
     Users _user = _users.GetUserByUserName(txtUserName.Text); 
     if (_user.Mode) 
     { 
      FormsAuthentication.SetAuthCookie(role, false); 
      Session.Add("UserName", txtUserName.Text); 
      Session.Add("UserID", _user.ID); 
      Response.Redirect("System/ShowActivities.aspx"); 
     } 
     else 
     { 
      lblLoginFail.Text = "your account is not authorized!"; 
      lblLoginFail.Visible = true; 
     } 
    } 
    else 
    { 
     if (txtPassword.Text != "" && txtUserName.Text != "") 
     { 
      lblLoginFail.Text = Application["Wrong_login_data"].ToString(); 
      lblLoginFail.Visible = true; 
     } 
    } 

正如你所看到的第一行我收到从数据库中的用户角色,如果用户不存在函数返回null。

接下来,如果用户的帐户被授权,那么我正在使用FormsAuthentication类来注册他,我正在传递用户的角色。

接下来我正在设置一个会话并将用户重定向到另一个页面。

我希望这是有帮助的

+0

我必须使用ASP.NET成员资格。 –

-1

我的回答的作品!

protected void LoginUser_LoggedIn(object sender, EventArgs e) 
{ 

     System.Web.UI.WebControls.Login controlLogin = (Login)sender; 
     MembershipUser user = (MembershipUser)Membership.GetUser(controlLogin.UserName); 
     ........ 
} 
+0

这个答案可能会好得多,我不得不回头再读一遍这个问题,而这段代码仍然让一些事情变得模糊。 – Malachi