how to display user name in login name control

2020-07-14 05:57发布

问题:

I have a master page that holds the loginview content that appears on all subsequent pages based on the master page. i have a username control also nested in the loginview to display the name of the user when they are logged in. the code for the loginview from the master page is displayed as follows:

<div class="loginView">
                <asp:LoginView ID="MasterLoginView" runat="server">
                    <LoggedInTemplate>
                        Welcome <span class="bold"><asp:LoginName ID="HeadLoginName" runat="server" /> 
                            <asp:Label ID="userNameLabel" runat="server" Text="Label"></asp:Label></span>!
                    [ <asp:LoginStatus ID="HeadLoginStatus" runat="server" LogoutAction="Redirect" LogoutText="Log Out" LogoutPageUrl="~/Logout.aspx"/> ]
                        <%--Welcome: 
                        <span class="bold"><asp:LoginName ID="MasterLoginName" runat="server" /> </span>!--%>                       
                    </LoggedInTemplate>
                    <AnonymousTemplate>
                        Welcome: Guest
                        [ <a href="~/Account/Login.aspx" ID="HeadLoginStatus" runat="server">Log In</a> ]
                    </AnonymousTemplate>

                </asp:LoginView>
                <%--&nbsp;&nbsp; [&nbsp;<asp:LoginStatus ID="MasterLoginStatus" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />&nbsp;]&nbsp;&nbsp;--%>

            </div>

Since VS2010 launches with a default login page in the accounts folder, i didnt think it necessary to create a separate log in page, so i just used the same log in page. please find the code for the login control below:

 <asp:Login ID="LoginUser" runat="server" EnableViewState="false" RenderOuterTable="false">
    <LayoutTemplate>
        <span class="failureNotification">
            <asp:Literal ID="FailureText" runat="server"></asp:Literal>
        </span>
        <asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="failureNotification" 
             ValidationGroup="LoginUserValidationGroup"/>
        <div class="accountInfo">
            <fieldset class="login">
                <legend style="text-align:left; font-size:1.2em; color:White;">Account Information</legend>
                <p style="text-align:left; font-size:1.2em; color:White;">
                    <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">User ID:</asp:Label>
                    <asp:TextBox ID="UserName" runat="server" CssClass="textEntry"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName" 
                         CssClass="failureNotification" ErrorMessage="User ID is required." ToolTip="User ID field is required." 
                         ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                </p>
                <p style="text-align:left; font-size:1.2em; color:White;">
                    <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label>
                    <asp:TextBox ID="Password" runat="server" CssClass="passwordEntry" 
                        TextMode="Password"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password" 
                         CssClass="failureNotification" ErrorMessage="Password is required." ToolTip="Password is required." 
                         ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                </p>
                <p style="text-align:left; font-size:1.2em; color:White;">
                    <asp:CheckBox ID="RememberMe" runat="server"/>
                    <asp:Label ID="RememberMeLabel" runat="server" AssociatedControlID="RememberMe" CssClass="inline">Keep me logged in</asp:Label>
                </p>
            </fieldset>
            <p class="submitButton">
                <asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Log In" 
                    ValidationGroup="LoginUserValidationGroup" onclick="LoginButton_Click"/>
            </p>
        </div>
    </LayoutTemplate>
</asp:Login>

I then wrote my own code for authentication since i had my own database. the following displays the code in the login buttons click event.:

 public partial class Login : System.Web.UI.Page
{
    //create string objects
    string userIDStr, pwrdStr;

    protected void LoginButton_Click(object sender, EventArgs e)
    {


        //assign textbox items to string objects
        userIDStr = LoginUser.UserName.ToString();
        pwrdStr = LoginUser.Password.ToString();

        //SQL connection string

        string strConn;
        strConn = WebConfigurationManager.ConnectionStrings["CMSSQL3ConnectionString"].ConnectionString;

        SqlConnection Conn = new SqlConnection(strConn);



        //SqlDataSource CSMDataSource = new SqlDataSource();
       // CSMDataSource.ConnectionString = ConfigurationManager.ConnectionStrings["CMSSQL3ConnectionString"].ToString();


        //SQL select statement for comparison

        string sqlUserData;
        sqlUserData = "SELECT StaffID, StaffPassword, StaffFName, StaffLName, StaffType FROM Staffs";
        sqlUserData += " WHERE (StaffID ='" + userIDStr + "')";
        sqlUserData += " AND (StaffPassword ='" + pwrdStr + "')";

        SqlCommand com = new SqlCommand(sqlUserData, Conn);
        SqlDataReader rdr;
        string usrdesc;
        string lname;
        string fname;
        string staffname;

        try
        {

            //string CurrentData;
            //CurrentData = (string)com.ExecuteScalar();
            Conn.Open();
            rdr = com.ExecuteReader();
            rdr.Read();
            usrdesc = (string)rdr["StaffType"];
            fname = (string)rdr["StaffFName"];
            lname = (string)rdr["StaffLName"];
            staffname = lname.ToString() + " " + fname.ToString();
            LoginUser.UserName = staffname.ToString();
            rdr.Close();

            if (usrdesc.ToLower() == "administrator")
            {

                Response.Redirect("~/CaseAdmin.aspx", false);

             }
             else if (usrdesc.ToLower() == "manager")
             {
                 Response.Redirect("~/CaseManager.aspx", false);
             }
             else if (usrdesc.ToLower() == "investigator")
             {
                 Response.Redirect("~/Investigator.aspx", false);
             }
             else
             {
                 Response.Redirect("~/Default.aspx", false);
             }               


        }
        catch(Exception ex)
        {
            string script = "<script>alert('" + ex.Message + "');</script>";
        }
        finally
        {
            Conn.Close();
        }


    }

My authentication works perfectly and the page gets redirected to the designated destination. However, the login view does not display the users name. i actually cant figure out how to pass the users name that i had picked from the database to the login name control to be displayed.

taking a close look i also noticed the logout text that should be displayed after successful log in does not show. that leaves me wondering if the loggedin template control on the masterpage even fires at all or its still the anonymous template control that keeps displaying.?

How do i get this to work as expected? Please help....

回答1:

What i know is that Login controls are bound to Fetch data from Membership provider. But since you are using your own Login System. It can't get login controls to show data.

If you want to allow Login Controls to show data automatically then Use Membership Classes

http://msdn.microsoft.com/en-us/library/tw292whz.aspx

or if you want to have your own Login system Then Create a Custom membership provider by Implementing Abstract Class MembershipProvider. heres a good resource on that

http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

Another way is to update user information Manually on the controls if you don't want to use membership provider..



回答2:

I just had this same issue come up. Using Forms authentication and a similar setup to the OP.

To resolve this I did the following in my app:

using System.Web.Security;

and then to set the LoginName:

FormsAuthentication.SetAuthCookie(usr.Username, false);

I have the following in my web.config:

    <authentication mode="Forms">
        <forms loginUrl="~/Login.aspx" protection="All" timeout="30" name=".ASPXAUTH" path="/" requireSSL="false" slidingExpiration="true" defaultUrl="~/Default.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
    </authentication>
    <authorization>
        <deny users="?"/>
    </authorization>

Sorry for responding to an old post but my search for answers led me here until I discovered it for myself...