2

メンバーシップとフォーム認証を使用する Web サイトがあります。

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.(リンク) 問題は、ユーザー認証後に Membership.GetUser() が null を返すのはなぜですか?

私の同僚の 1 人は、Membership.GetUser()useを使用する代わりにMembership.GetUser(UserNameTextBox.Text)、ユーザーはこのユーザー名で認証されているので問題ないと言いましたが、問題は、 を取得する方法が見つからないことですUsername.Text。使用findControl()してエラーが発生しました。

何か案が?

4

4 に答える 4

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...
    }
}
于 2012-09-16T17:06:08.730 に答える
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 クラスを使用してユーザーを登録し、ユーザーの役割を渡します。

次に、セッションを設定して、ユーザーを別のページにリダイレクトします。

お役に立てば幸いです

于 2012-09-16T17:09:31.117 に答える
0

最後に、@LolCoder のアイデアに基づく解決策を見つけました。

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

    if (Roles.IsUserInRole(username, "User"))
    {
        //...
    }
    // ...
}
于 2012-09-18T08:13:43.053 に答える
-1

私の答えはうまくいきます!

protected void LoginUser_LoggedIn(object sender, EventArgs e)
{

      System.Web.UI.WebControls.Login controlLogin = (Login)sender;
      MembershipUser user = (MembershipUser)Membership.GetUser(controlLogin.UserName);
      ........
 }
于 2013-05-31T00:25:07.650 に答える