3

我有一个应该从两个 SQL Server 访问数据的 asp.net 应用程序。其中一个 SQL Server 与 IIS 位于同一台机器上(我们称之为 SQLSERVER1),而另一个 SQL Server 位于另一台机器上(SQLSERVER2)。

两个 SQL 服务器都信任连接字符串。在我的 web.config 文件中,模拟已设置为 true。我在 IIS 和 web.config 中都使用 Windows 身份验证。

当我尝试从 SQLSERVER2 访问数据时,我因 user(null) 错误而登录失败。我通过 Windows 登录的用户在 SQLSERVER2 中作为 SQL 服务器帐户存在。

可能的原因是什么?

注意: 这是一个新手问题恕我直言

注意:使用的 IIS 是 6.0 (Windows 2003)。它未设置为 IIS 5.0 隔离模式。

编辑:被冒充的用户是域用户

添加:

我还想声明,当我作为运行 IIS 的服务器的客户端访问它时收到此错误消息。换句话说,假设我在机器 A 上工作,IIS 和 SQLSERVER1 在机器 B 上,SQLSERVER2 在机器 C 上。

当我在机器 B 上工作时,我没有收到此错误消息。这让我更加难过。

4

5 回答 5

7

这绝对是一个委托问题。正如一位人士指出的那样,您需要确保正在使用Kereberos身份验证。旧式NTLM不会削减它。这里有更多关于Kerberos 与 NTLM的信息。

简而言之,如果您有一个网络服务器和一个数据库,并且您希望网络服务器在发出数据库请求时模拟用户(以便您可以直接在每个用户或用户组的基础上设置数据库权限),那么您重新执行双跳。凭据必须首先从用户的计算机传递到网络服务器,然后再传递到数据库。可以想象,数据库必须信任网络服务器“不作恶”,否则这可能是一个极其危险的安全漏洞。因此,您必须设置 Windows Server 世界中所谓的“委托” ...

微软在这里有一篇关于这一切的好文章。此外,您可以查看这样的文章以了解如何设置它。我们经常遇到这种情况,一开始可能会很痛苦,尤其是因为作为开发人员,您可能无法直接控制服务器(尤其是生产服务器),并且您必须花费大量时间来处理楼下的服务员。

于 2008-10-10T13:06:20.767 回答
3

您可能会遇到此问题,因为基于非 Kerberos 的模拟 (NTLM) 仅在本地计算机(网络服务器)上有效。如果您希望能够使用这些凭据访问另一台计算机,则需要确保您使用的是 Kerberos。

试试这个: http: //support.microsoft.com/kb/810572

于 2008-10-10T12:13:37.300 回答
0

您对网络服务器的身份验证不会传递到 sql 服务器。Web 服务器正在使用运行应用程序池的帐户向 SQL Server 进行身份验证。

于 2008-10-10T12:35:01.940 回答
0

您应该检查 SQLSERVER1 的计算机帐户是否已启用委派信任。否则 SQLSERVER2 将不信任在 SQLSERVER1 上运行的模拟。这是除了确认首先使用 Kerberos 设置模拟之外的。这也假设服务器和用户都是同一个域的成员。

顺便说一句,你确定你想以这种方式做事,你最终会创建更多的连接,因为它们最终对用户来说是独一无二的吗?

于 2008-10-10T12:54:35.660 回答
0

您是否尝试从 Server1 使用 SQL SErver 管理员访问 server2 上的数据库并成功连接?

如果不是,那么这可能是因为默认情况下 SQL Server 安装自身时默认关闭了 tcp。

您需要确保已为 server2 打开此功能以允许 server1 进行连接。server1 连接没有问题,因为它可以使用共享内存连接。

于 2008-10-10T13:16:51.557 回答