5

我有这样的 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”帐户下运行它,然后单击测试连接,它会成功。既然是这种情况,我只是不明白问题可能是防火墙或任何类似性质的东西。有谁知道可能出了什么问题?我无权登录数据库服务器本身,因此此时我无法检查其事件日志(等)。

4

2 回答 2

2

您的问题来自连接字符串。连接字符串中的“ Network Library = dbmssocn ”将使客户端尝试在 UDP 端口 1434 而不是 TCP 端口 1433 上连接到 SQL Server。您从应用程序将连接的应用程序的连接字符串中删除“ Network Library = dbmssocn ”成功到 SQL 服务器。

于 2013-06-14T22:20:40.157 回答
0

匿名登录失败错误意味着 kerberos 身份验证由于某种原因失败。

Kerberos 委托(委托是将您的模拟凭据传递到另一台机器时)在理论上相对简单。在实践中,它充满了陷阱,可能是最令人沮丧的故障排除之一。

在您的情况下,从您的程序的角度来看,完全有可能模拟成功,但它传递给 sql server 的令牌不可用。

如果您很幸运并且可以访问非常好的网络/系统管理员,那么他们可以帮助您解决问题。
否则,谷歌搜索“sql server kerberos 委派”将为您指明正确的方向。

这是需要大量来回解决的问题,更适合论坛而不是问答网站。

于 2013-06-17T06:24:09.663 回答