C# 这是一个很好的登录,并根据数据库实践验证用户吗?
我想问一下我所做的是否被认为是登录环境的良好实践,我正在创建一个SaaS,希望您通过登录服务器进行身份验证,以便使用我正在创建的软件,但我想检查我使用的方法是否正确,所以我会把我所做的事情贴在这里,看看你对它的看法!提前感谢大家的评论C# 这是一个很好的登录,并根据数据库实践验证用户吗?,c#,sql,security,login,C#,Sql,Security,Login,我想问一下我所做的是否被认为是登录环境的良好实践,我正在创建一个SaaS,希望您通过登录服务器进行身份验证,以便使用我正在创建的软件,但我想检查我使用的方法是否正确,所以我会把我所做的事情贴在这里,看看你对它的看法!提前感谢大家的评论 private void AcceptButton_Click(object sender, EventArgs e) { bool loginSuccesful = false; if (string.IsNullOrEm
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))
我认为如果条件为真,您需要返回..这一行可以更改为返回一个datatableSqlDataReader dr=cmd.ExecuteReader()如果计数>0,那么您知道这是成功的,如果您返回一个数据表,那么while循环是不必要的。您可以使用(){}
将sql对象包装在中,以利用自动处理的优势,并在您有时间时读取它。您正在以纯文本形式存储用户密码。所以不,这不是一个好的做法。您还丢弃了catch
块中可能有用的异常信息。select*from dbo.Users
如果您只检查/返回用户名和密码,那么将查询更改为仅选择所需的列。。看看如何使用PrincipalContext和一些基本的广告代码
以及这行的用法this.DialogResult=DialogResult.OK代码>有这么多(正确编写的)安全模块可用..在这一行中如果(string.IsNullOrEmpty(usernameTextBox.Text))
我认为如果条件为真,您需要返回..这一行可以更改为返回一个datatableSqlDataReader 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)。