更改密码时出现连接问题

时间:2019-06-24 08:17:29

标签: c#

我有一个软件,该软件可以显示SQL数据库中的某些表。现在,我想添加一个工具,可以在其中更改“ testdummy”用户的密码。

我尝试再次打开连接,但没有帮助。如果您需要一些其他代码或信息,只需写评论。

请注意,我是编程新手。我是一个学徒,目前正在学习编程和管理数据库。我知道这不是最安全的解决方案,但这只是我老师的一项小任务。该软件将不会为客户发布。

就像我之前提到的那样,在尝试更改密码之前,我尝试再次打开连接。

 public void Change()
        {
            SqlConnection con = new SqlConnection();
            string connectionString = GetConnectionString();


            if (NewPassword.Password == NewPasswordAgain.Password && OldPassword.Password == GlobalData.Password)
            {
                try
                {
                    //dbMan.TryConnect(connectionString);
                    //con.Open();
                    SqlConnection.ChangePassword($"Data Source={GlobalData.ServerName};Initial Catalog={GlobalData.DBName};UID={GlobalData.Username};PWD={OldPassword}", $"{NewPassword}");
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Unable to change password. Try again!" + ex);
                }
            }
            else
            {
                // If new Password doesn't match.
                MessageBox.Show("Passwords doesn't match!");
            }
        }

尝试更改密码时,我遇到SQL异常。

(System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'csharptest'.

我在:

SqlConnection.ChangePassword($"Data Source={GlobalData.ServerName};Initial Catalog={GlobalData.DBName};UID={GlobalData.Username};PWD={OldPassword}", $"{NewPassword}");

在编程的这一点上,应该有一个到数据库的连接,因为我可以处理一些表并处理数据集。

但是当我取消评论时:

//dbMan.TryConnect(connectionString);
//con.Open();

它进入那里的固定支架:

public bool TryConnect(string connectionString)
        {
            conn = new SqlConnection();
            conn.ConnectionString = connectionString;

            try
            {
                conn.Open();
                return true;
            }
            catch (Exception)
            {
                MessageBox.Show("Couldn't connect");
                return false;
            }
        }

并返回以下异常:

System.InvalidOperationException: 'Die ConnectionString-Eigenschaft wurde nicht initialisiert.'

用英语应该是这样的:“ connectionstring属性尚未初始化”

编辑: 在日志中,我得到这个:

Login failed for user 'csharptest'. Reason: Password did not match that for the login provided.

编辑: 代替:

SqlConnection.ChangePassword($"Data Source={GlobalData.ServerName};Initial Catalog={GlobalData.DBName};UID={GlobalData.Username};PWD={OldPassword}", $"{NewPassword}");

我这样做了:

string updatePassword = "USE CSHARPTEST ALTER LOGIN [" + GlobalData.Username + "] WITH PASSWORD =  '" + NewPassword + "'";
con.Open();
cmd.ExecuteNonQuery();

现在我认为唯一的问题是服务器上的权限。

1 个答案:

答案 0 :(得分:0)

您需要在DbContext级别使用参数。有关更多详细信息,请参见此答案,但这是一个代码示例(改编自同一页面):

string sql = "ALTER LOGIN @loginName WITH PASSWORD = @password";
ctx.Database.ExecuteSqlCommand(
    sql,
    new SqlParameter("loginName", loginName),
    new SqlParameter("password", password));

在此处(以及所有地方)使用参数的目的是为了防止SQL注入攻击。考虑到您正在编写更改密码的代码,这一点尤其重要。

更新

ALTER LOGIN语句不适用于变量;它必须通过动态SQL完成。这是更新代码的示例:

string sql = @"DECLARE @sql NVARCHAR(500)
               SET @sql = 'ALTER LOGIN ' + QuoteName(@loginName) + 
                    ' WITH PASSWORD= ' + QuoteName(@password, '''') 
               EXEC @sql ";
ctx.Database.ExecuteSqlCommand(
    sql,
    new SqlParameter("loginName", loginName),
    new SqlParameter("password", password));

请注意,我们仍在使用SqlParameters来防止SQL注入攻击。我们还使用T-SQL方法QuoteName在生成的SQL中进行正确的引用。但是此方法只是将任何[字符(在第一个调用中)或'字符(在第二个调用中)加倍。还有很多其他用于SQL注入攻击的媒介,因此仅依靠QuoteName是不够的。