Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟成功,但数据库连接失败_C#_Sql Server_Impersonation - Fatal编程技术网

C# 模拟成功,但数据库连接失败

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

我有这样的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;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本身。我将接受你的回答,因为它确实回答了我原来的问题。我将提交另一个问题,看看是否有人能帮助我解决这个新问题。非常感谢!啊,我要试试看!