2012-09-16 168 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