Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是一个很好的登录,并根据数据库实践验证用户吗?_C#_Sql_Security_Login - Fatal编程技术网

C# 这是一个很好的登录,并根据数据库实践验证用户吗?

C# 这是一个很好的登录,并根据数据库实践验证用户吗?,c#,sql,security,login,C#,Sql,Security,Login,我想问一下我所做的是否被认为是登录环境的良好实践,我正在创建一个SaaS,希望您通过登录服务器进行身份验证,以便使用我正在创建的软件,但我想检查我使用的方法是否正确,所以我会把我所做的事情贴在这里,看看你对它的看法!提前感谢大家的评论 private void AcceptButton_Click(object sender, EventArgs e) { bool loginSuccesful = false; if (string.IsNullOrEm

我想问一下我所做的是否被认为是登录环境的良好实践,我正在创建一个SaaS,希望您通过登录服务器进行身份验证,以便使用我正在创建的软件,但我想检查我使用的方法是否正确,所以我会把我所做的事情贴在这里,看看你对它的看法!提前感谢大家的评论

private void AcceptButton_Click(object sender, EventArgs e)
    {
        bool loginSuccesful = false;
        if (string.IsNullOrEmpty(usernameTextBox.Text))
        {
            MessageBox.Show("Por favor introduzca su Usuario.");
            usernameTextBox.Focus();
        }
        else
        {
            try
            {
                string connectionString = ConfigurationSettings.AppSettings["IntegraTDB"].ToString().Trim();
                SqlConnection con = new SqlConnection(connectionString);
                con.Open();
                SqlCommand cmd = new SqlCommand("select * from dbo.Users where Username = @Username and Password = @Password", con);
                cmd.Parameters.AddWithValue("@Username", usernameTextBox.Text);
                cmd.Parameters.AddWithValue("@Password", passwordTextBox.Text);                    
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    loginSuccesful = true;
                }
                dr.Close();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error de autenticación: " + ex.Message);
            }
            if (loginSuccesful == true)
            {
                role_Extraction();
                IIdentity identity;
                identity = new GenericIdentity(usernameTextBox.Text);
                IPrincipal principal = new GenericPrincipal(identity, _roles);
                Thread.CurrentPrincipal = principal;
                MessageBox.Show("Bienvenido a IntegraT!");
                this.DialogResult = DialogResult.OK;
            }
            else
            {
                MessageBox.Show("Usuario y/o Contraseña incorrectos.");
            }
        }
    }

上面的内容看起来像是在数据库中存储纯文本密码。在IMO中,应始终避免这种情况。至少应使用某种形式的哈希


更好的方法是利用身份验证解决方案,如active directory

以上内容看起来像是在数据库中存储纯文本密码。在IMO中,应始终避免这种情况。至少应使用某种形式的哈希


更好的方法是利用身份验证解决方案,如active directory

您正在以纯文本形式存储用户密码。所以不,这不是一个好的做法。您还丢弃了
catch
块中可能有用的异常信息。
select*from dbo.Users
如果您只检查/返回用户名和密码,那么将查询更改为仅选择所需的列。。看看如何使用
PrincipalContext和一些基本的广告代码
以及这行的用法
this.DialogResult=DialogResult.OK有这么多(正确编写的)安全模块可用..在这一行中
如果(string.IsNullOrEmpty(usernameTextBox.Text))
我认为如果条件为真,您需要返回..这一行可以更改为返回一个datatable
SqlDataReader dr=cmd.ExecuteReader()0,那么您知道这是成功的,如果您返回一个数据表,那么while循环是不必要的。您可以使用(){}
将sql对象包装在
中,以利用自动处理的优势,并在您有时间时读取它。您正在以纯文本形式存储用户密码。所以不,这不是一个好的做法。您还丢弃了
catch
块中可能有用的异常信息。
select*from dbo.Users
如果您只检查/返回用户名和密码,那么将查询更改为仅选择所需的列。。看看如何使用
PrincipalContext和一些基本的广告代码
以及这行的用法
this.DialogResult=DialogResult.OK有这么多(正确编写的)安全模块可用..在这一行中
如果(string.IsNullOrEmpty(usernameTextBox.Text))
我认为如果条件为真,您需要返回..这一行可以更改为返回一个datatable
SqlDataReader dr=cmd.ExecuteReader()0,那么您知道这是成功的,如果您返回一个数据表,那么while循环是不必要的。您的sql对象可以使用(){}包装在
若要利用自动处理功能,并在您有时间使用active directory解决方案时仔细阅读,我是否需要在同一网络中?您需要对active directory进行网络访问,远程用户可以使用VPN或类似功能。如果是web应用程序,则只有web服务器需要访问ad环境。在这种情况下,应在外围网络中使用代理以增加安全性。如果您告诉我应用程序的体系结构或用户模型,我可以更完整地回答。它是一个winforms应用程序,在您的计算机中工作,但在它访问它之前,它希望您登录到我的服务器。这是我的应用程序的基本形式。然后您的服务器(我假设web/服务合同)将需要访问Active directory域。我不同意您关于散列密码的回答。哈希密码比明文密码好,但这不是最先进的。更好的方法是使用用户特定的随机salt进行散列(例如使用HMAC)。对于active directory解决方案,我是否需要在同一网络中?您需要对active directory进行网络访问,远程用户可以使用VPN或类似方式。如果是web应用程序,则只有web服务器需要访问ad环境。在这种情况下,应在外围网络中使用代理以增加安全性。如果您告诉我应用程序的体系结构或用户模型,我可以更完整地回答。它是一个winforms应用程序,在您的计算机中工作,但在它访问它之前,它希望您登录到我的服务器。这是我的应用程序的基本形式。然后您的服务器(我假设web/服务合同)将需要访问Active directory域。我不同意您关于散列密码的回答。哈希密码比明文密码好,但这不是最先进的。更好的方法是使用用户特定的随机盐进行散列(例如使用HMAC)。