C# 模拟成功,但数据库连接失败
我有这样的C#(.NET 4.5)代码(为了演示而简化),用于连接SQL Server 2012数据库:C# 模拟成功,但数据库连接失败,c#,sql-server,impersonation,C#,Sql Server,Impersonation,我有这样的C#(.NET 4.5)代码(为了演示而简化),用于连接SQL Server 2012数据库: public static void Test(WindowsIdentity ident) { using (WindowsImpersonationContext ctx = ident.Impersonate()) { using (SqlConnection con = new SqlConnection("Data Source=MyServer;I
public static void Test(WindowsIdentity ident)
{
using (WindowsImpersonationContext ctx = ident.Impersonate())
{
using (SqlConnection con = new SqlConnection("Data Source=MyServer;Initial Catalog=MyDatabase;Persist Security Info=False;Integrated Security=SSPI;Network Library=dbmssocn"))
{
con.Open();
}
ctx.Undo();
}
}
Open()
方法每次都会抛出以下异常:
System.Data.SqlClient.SqlException(0x80131904):与网络相关的或
建立到的连接时发生特定于实例的错误
SQL Server。找不到服务器或无法访问服务器。验证
实例名称正确且SQL Server配置为
允许远程连接。(提供程序:TCP提供程序,错误:0-否
由于目标计算机主动拒绝,因此无法建立连接
它。)
模拟正在成功,因为如果我添加如下跟踪:
public static void Test(WindowsIdentity ident)
{
using (TextWriterTraceListener listener = new TextWriterTraceListener(@"C:\temp\trace.log"))
{
using (WindowsImpersonationContext ctx = ident.Impersonate())
{
listener.WriteLine("Impersonated");
using (SqlConnection con = new SqlConnection("Data Source=MyServer,MyPort;Initial Catalog=MyDatabase;Persist Security Info=False;Integrated Security=SSPI;Network Library=dbmssocn"))
{
listener.WriteLine("About to open connection; WindowsIdentity.GetCurrent().Name = " + WindowsIdentity.GetCurrent().Name);
con.Open();
}
ctx.Undo();
listener.WriteLine("Impersonation undone");
}
}
}
我明白了:
Impersonated
About to open connection; WindowsIdentity.GetCurrent().Name = MyDomain\MyUser
如果我将完全相同的连接字符串放入.udl文件中,在同一台计算机上的同一个“MyDomain\MyUser”帐户下运行它,然后单击测试连接,则成功。既然是这样,我就不明白问题怎么可能是防火墙或其他类似的东西。有人知道会出什么问题吗?我无权登录数据库服务器本身,因此此时无法检查其事件日志(等)。您的问题来自连接字符串。连接字符串中的“Network Library=dbmssocn”将使客户端尝试通过UDP端口1434而不是TCP端口1433连接到SQL server。从应用程序的连接字符串中删除“网络库=dbmssocn”,应用程序将成功连接到SQL server 匿名登录失败错误意味着kerberos身份验证由于某种原因失败 Kerberos委派(委派是指将模拟凭据传递到另一台计算机时的委派)在理论上相对简单。在实践中,它充满了gotcha的问题,可能是最令人沮丧的问题之一 在您的情况下,从程序的角度来看,完全有可能模拟成功,但它传递给sql server的令牌不可用 如果您运气好,能够访问非常优秀的网络/系统管理员,那么他们可以帮助您排除故障。
否则,谷歌搜索“SQLServerKerberos委派”将为您指明正确的方向
这类问题需要反复解决,更适合论坛而不是问答网站。谢谢你的建议。从连接字符串中删除该段后,我得到以下错误:System.Data.SqlClient.SqlException(0x80131904):用户“NT AUTHORITY\ANONYMOUS LOGON”的登录失败。但是,跟踪保持不变,这意味着模拟仍在成功,但由于某种原因,它没有被用于尝试连接?因此这是另一个问题。您应该检查导致使用匿名而不是当前登录用户的网络配置。请尝试以下“Data Source=192.162.1.1001433;network Library=DBMSSOCN;…”替换192.162.1.100要连接的特定端口是您的计算机端口。好的,很公平。不幸的是,我对网络一无所知,正如前面提到的,我无法访问SQL Server box本身。我将接受你的回答,因为它确实回答了我原来的问题。我将提交另一个问题,看看是否有人能帮助我解决这个新问题。非常感谢!啊,我要试试看!