模拟SQL连接字符串C#MVC的用户

问题描述

我在web.config中有几个连接字符串,理想情况下,使用那些连接字符串和指定的凭据(在web.config中),我将必须打开一个连接并进行插入-对于这两个连接(让我们说connection1和连接2)。

现在,connetcion1和connection2具有不同的凭据。我尝试在web.config的连接字符串中使用它们,但它始终表示用户登录失败。下面是连接字符串。

<connectionStrings>
<add name="connection_2" connectionString="Data Source=domain\servername;Initial Catalog=dbname;User ID=domain\xxxx;Password=abcgdd****;"  providerName="System.Data.sqlClient"/>

<add name="connection_3" connectionString="Data Source=domain\servername;Initial Catalog=dbname;User ID=domain\yyyy;Password=fgdd****;"  providerName="System.Data.sqlClient"/>
<connectionStrings> 

因此,经过一番谷歌搜索后,我必须使用模拟功能

使用以下代码进行模拟

using (new Impersonator("username","domain","pwd"))
{
// trying to open connection 1 from web.config but it says no such user. 

using (sqlConnection connection = new sqlConnection("Connection1FromConfig"))
                            {
                                cmd = new sqlCommand("select * from abc",connection);
                                connection.open();
                                cmd.ExecuteNonQuery();
                                connection.Close();
                                
                            }
}

Connection used while impersonation is :

 <add name="Connection2" connectionString="Data Source=domain\server;Initial Catalog=DB;"  providerName="System.Data.sqlClient"/>

`````

Used the code from here for impersonation class - https://daoudisamir.com/impersonate-users-in-c/ 

解决方法

如果您打算通过模拟使用 Windows 凭据,则需要在连接字符串中提供 Trusted_Connection=yes;

这是我成功使用的connectionString,

string srvConnection = $"Server={serverName}; Trusted_Connection=yes; connection timeout=15";

我获得了 Impersonator 类 from here 并且能够成功使用它。我需要使用的 SQL 帐户与用于 IIS/应用程序池的域帐户不同。

string srvConnection = $"Server={ListenerName}; Trusted_Connection=yes; connection timeout=15";
using (SqlConnection connection = new SqlConnection(srvConnection)) 
{
    using (new Impersonator(creds.Username.Split('\\').Last(),creds.Username.Split('\\').First(),creds.Password))
        connection.Open();

    // other code that needs to use the connection goes here.
    cmd = new SqlCommand("select * from abc",connection);
    cmd.ExecuteNonQuery();
}

您不需要因为 using 语句而关闭连接。因为模拟只需要打开连接,所以除了 connection.Open(); 语句之外,你不需要在任何地方使用它。