c# - 当前上下文中不存在变量 C#

标签 c# asp.net

我正在 asp.net 中为登录页面编写一些服务器端验证。

现在,我从“从头开始编写”PHP 的角度出发,正在学习并努力解决其中一些我不知道的 ASP.NET 概念。

如果输入有效,我尝试将用户名和密码变量设置为“有效”,并且我尝试使用这些变量继续登录。

我也不确定这是否是正确的做法。

protected void loginbutton_Click(object sender, EventArgs e)
    {
        string UsernameRegex = "[a-zA-Z]+";
        string PasswordRegex = "[a-zA-Z0-9]+";

        if (!Regex.IsMatch(usernametextbox.Text, UsernameRegex))
        {
            string UsernameCheck = "valid";
        }
        else
        {
            string UsernameCheck = "invalid";
        }

        if (!Regex.IsMatch(passwordtextbox.Text, PasswordRegex))
        {
            string PasswordCheck = "valid";
        }
        else
        {
            string PasswordCheck = "invalid";
        }


        if(UsernameCheck = "valid") //i will include password here after i solved the problem
        {
            //do something
        }
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
            conn.Open();
            string checkuser = "select count(*) from Users where Username = @username and Password = @password";

            SqlCommand com = new SqlCommand(checkuser, conn);
            com.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text;
            com.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwordtextbox.Text;

            int temp = Convert.ToInt32(com.ExecuteScalar().ToString());

            if (temp > 0)
            {
                Response.Redirect("Cars.aspx");
            }
            else
            {
                loginfaillabel.Text = "Your Username or Password doesn't match our records";
            }
        }

感谢帮助和反馈。

最佳答案

好的,这里有很多反馈。

  1. 使用 bool 值,而不是字符串!我为你替换了它们。这里的主要问题是范围。您可以在 if 之外声明变量并解决问题,但最好使用 bool 值并一起删除 if block ,因为它变得更具可读性。
  2. 始终将实现 IDisposable 的 Ado.Net 类型包装在 using block 中。这样,如果代码遇到异常,您的连接仍然会关闭(这是一件好事)
  3. 无需在 sql 语句中执行 count,只需返回 1。如果有用户,您就会得到结果,否则不会。
  4. 切勿以明文形式存储密码!我没碰过这个,那是你的事。有许多合适的密码哈希算法可供选择,例如 pbkdf2bcryptscrypt 等,仅举一些更普遍接受的安全算法。
  5. 您确定用户名是 Unicode 吗?如果没有,请将 SqlParameter 类型中的参数类型更改为 VarChar

修改后的代码

protected void loginbutton_Click(object sender, EventArgs e)
{
    string UsernameRegex = "[a-zA-Z]+";
    string PasswordRegex = "[a-zA-Z0-9]+";

    boolean isUsernameValid = Regex.IsMatch(usernametextbox.Text, UsernameRegex)
    boolean isPasswordValid = Regex.IsMatch(passwordtextbox.Text, PasswordRegex);


    if(!isUsernameValid || !isPasswordValid) //i will include password here after i solved the problem
    {
        //do something
    }
    else
    {
        const string checkuser = "SELECT 1 FROM Users WHERE Username = @username and Password = @password";

        using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        using(SqlCommand com = new SqlCommand(checkuser, conn))
        {
            conn.Open();

            com.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text;
            com.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwordtextbox.Text;

            object temp = com.ExecuteScalar();

            // I do not remember if it is null or System.DbNull.Value that is returned if nothing is returned
            // you will have to test it
            var didUserMatch = temp == null || temp == System.DbNull.Value ? false : true;

            if (didUserMatch)
            {
                Response.Redirect("Cars.aspx");
            }
            else
            {
                loginfaillabel.Text = "Your Username or Password doesn't match our records";
            }
        }
    }
}

关于c# - 当前上下文中不存在变量 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584650/

相关文章:

c# - 动态加载具有相同功能的不同库

asp.net - 使用 JWT 进行模拟

c# - XmlDocument 不保存字符实体

在删除 cookie 之前,Asp.Net 页面不会响应

c# - "Common Language Runtime detected an invalid program"位于带有 CaSTLe Windsor 的 Azure Web 角色上

asp.net - 通过 QueryString 传递对象

c# - 无法使用 asp.net 中的 twilio 短信服务发送回复短信

c# - 异步/等待取消机制

c# - 没有 SslStream 的 SSL 因为我想通过 SOCKS5 代理连接

c# - ISO8601 直接 DateTime 单日解析不正确