ASP.NET成员登录:登录后重定向用户

时间:2012-09-16 16:53:20

标签: asp.net asp.net-membership

我有一个使用成员资格和表单身份验证的网站:

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)而且没关系,因为用户使用此用户名进行了身份验证但问题是我无法找到获取{{1的方法}}。我使用Username.Text并收到错误。

任何想法?

4 个答案:

答案 0 :(得分: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...
    }
}

答案 1 :(得分: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类注册他,我正在传递用户的角色。

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

我希望它有用

答案 2 :(得分:0)

最后,我找到了基于@LolCoder理念的解决方案:

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

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

答案 3 :(得分:-1)

我的回答有效!

protected void LoginUser_LoggedIn(object sender, EventArgs e)
{

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