0

サイト マスターにasp.net ログイン コントロールを実装する必要があります。

私がしたことは次のとおりです。

私は3つのものを取りました

  • サイトマスター
  • ホーム.aspx
  • webform1.aspx

サイトマスターに次のように書きました。

<form id="form1" runat="server">
    <div>
        <asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate" OnLoginError="Login1_LoginError">
        </asp:Login>
    </div>
    <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
    </div>
</form>

コードビハインドでは、次のことを書きました。

 public partial class SiteMaster1 : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
                ViewState["LoginErrors"] = 0;
        }

        #region Login Functionality
        /// <summary>
        ///  will validation if the username and password while click on login button from asp.net login button  
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
        {
            if (YourValidationFunction(Login1.UserName, Login1.Password))
            {
                //e.Authenticated = true;
                Login1.Visible = false;
                //MessageLabel.Text = "Successfully Logged In";
            }
            else
            {
                e.Authenticated = false;
            }
        }
        /// <summary>
        /// Will show the error
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Login1_LoginError(object sender, EventArgs e)
        {
            if (ViewState["LoginErrors"] == null)
                ViewState["LoginErrors"] = 0;

            int ErrorCount = (int)ViewState["LoginErrors"] + 1;
            ViewState["LoginErrors"] = ErrorCount;

            if ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty))
                Response.Redirect(Login1.PasswordRecoveryUrl);
        }

        /// <summary>
        /// function to check the username and password to server 
        /// </summary>
        /// <param name="UserName"></param>
        /// <param name="Password"></param>
        /// <returns></returns>
        private bool YourValidationFunction(string UserName, string Password)
        {
            bool boolReturnValue = false;
            string strConnection = "i wrote correct string, cannot write here on stackoverflow";

            SqlConnection sqlConnection = new SqlConnection(strConnection);
            String SQLQuery = "SELECT UserName, Password FROM aspnet_Users";
            SqlCommand command = new SqlCommand(SQLQuery, sqlConnection);
            SqlDataReader Dr;
            sqlConnection.Open();
            Dr = command.ExecuteReader();
            while (Dr.Read())
            {
                if ((UserName == Dr["UserName"].ToString()) & (Password == Dr["Password"].ToString()))
                {
                    boolReturnValue = true;
                }
                Dr.Close();
                return boolReturnValue;
            }
            return boolReturnValue;
        }
        #endregion
    }

私の問題は:表示方法を管理したい

Asp.Net ログイン コントロール:

たとえば、他のページ webform1.aspx に移動すると、asp.net ログイン コントロールが表示されます (そのコントロールを非表示にしても)。これの代わりに、表示したいwelcome [Username]

4

1 に答える 1

0

Login コントロールのDestinationPageUrlプロパティを目的のページに設定します。

補足として、ユーザーを認証する方法には深刻な問題があります

private bool YourValidationFunction(string UserName, string Password)
{
    bool boolReturnValue = false;
    string strConnection = "i wrote correct string, cannot write here on stackoverflow";

    String SQLQuery = "SELECT count(*) FROM aspnet_Users where Username=@uname AND Password = @pwd";
    using(SqlConnection sqlConnection = new SqlConnection(strConnection))
    using(SqlCommand command = new SqlCommand(SQLQuery, sqlConnection))
    {
        sqlConnection.Open();
        command.Parameters.AddWithValue("@uname", Username);
        command.Parameters.AddWithValue("@pwd", Password);
        int result = Convert.ToInt32(command.ExecuteScalar());
        boolReturnValue = (result > 0);
    }
    return boolReturnValue;
}

この関数の書き直しでは、using ステートメントを使用して、使用後に接続を確実に閉じて破棄しました。また、 SQL インジェクションの問題を回避するためにパラメーター化されたクエリを導入し、クエリ コマンドを ExecuteScalar メソッドを使用するように変更しました。

Connection は貴重なリソースであり、使用後すぐに OS に解放する必要があります。using ステートメントにより、例外が発生した場合でも、接続が閉じられ、右中括弧で破棄されることが保証されます。パラメータ化されたクエリは、悪意のある文字列がデータベースに渡されるのを防ぎ、フレームワークが文字列、日付、および数値の小数を正しくフォーマットできるようにします。ExecuteScalar は、ユーザーとパスワードのペアがデータベースに存在するかどうかだけを知る必要がある場合のように、データベースから返される値が 1 つだけ必要な場合に非常に便利です。

于 2013-09-08T11:55:43.947 に答える