更改 SqlConnection、凭据 属性

Change the SqlConnection,Credentials property

所以我有一个登录页面,我必须执行验证:'If the user is "sa" then it should connect to the Database using that users credentials',这意味着我必须修改我的 SqlConnection 对象的凭据:

        if(username.Equals("sa", StringComparison.OrdinalIgnoreCase))
        {
            var securePassword = new System.Security.SecureString();
            foreach(char character in password)
            {
                securePassword.AppendChar(character);
            }

            securePassword.MakeReadOnly();
            var credentials = new SqlCredential(username, securePassword);
            sqlConn.Close();
            sqlConn.Credential = credentials;

            sqlConn.Open();

            return true;
        }

但是我在 sqlConn.Credential = credentials; 中遇到异常,即使 属性 不是 readonly

InvalidOperationException: Cannot use Credential with UserID, UID, Password, or PWD connection string keywords.

有没有其他方法可以改变 Credentials 属性?

提前致谢。

如果 SqlConnection 有用户和密码,您似乎可以修改凭据。我使用 this 教程的示例使其工作:

        if (username.Equals("sa", StringComparison.OrdinalIgnoreCase))
        {
            using (SqlConnection conn = new SqlConnection(string.Format("Server={0};Initial Catalog={1};", sqlConn.DataSource, sqlConn.Database)))
            {
                var securePassword = new System.Security.SecureString();
                foreach (char character in password)
                {
                    securePassword.AppendChar(character);
                }

                securePassword.MakeReadOnly();

                var credentials = new SqlCredential(username, securePassword);
                conn.Credential = credentials;

                conn.Open();

                return true;
            }
        }

因为我无法修改 Credential 属性,所以我复制了 SqlConnection 对象,但没有 usernamepassword connectionString。这样我以后就可以添加新的 Credential 了。希望这可以帮助其他面临类似问题的人。

SqlConnection.Credential 属性

来自https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.credential(v=vs.110).aspx

将引发 InvalidOperationException 异常:

  • 如果在打开的连接上设置了凭据。
  • 如果在 Context Connection=true 时设置了 Credential。
  • 如果在 Integrated Security = true 时设置了 Credential。
  • 如果在连接字符串使用密码时设置了凭据。
  • 如果在连接字符串使用 UserID 时设置了凭据。

或者您可以使用 SqlConnectionStringBuilder,

string connectString = "Data source=.;initial catalog=yourDB; 
                        User Id=user; Password=password";
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder (connectString);
SqlConnection sqlConn= new SqlConnection(builder.ConnectionString);

那么在你的方法中,

 builder.Remove("User Id");
 builder.Remove("Password");
 // builder.Remove("integrated security"); if you had used
 sqlConn.ConnectionString = builder.ConnectionString;