使用asp.net的Windows身份验证问题

时间:2008-10-10 11:56:39

标签: asp.net iis-6 windows-authentication

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

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

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

可能的原因是什么?

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

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

编辑:被模仿的用户是域用户

添加:

当我将其作为运行IIS的服务器的客户端访问时,我还想声明我收到此错误消息。换句话说,让我说我正在使用机器A,IIS和SQLSERVER1在机器B上,而SQLSERVER2在机器C上。

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

5 个答案:

答案 0 :(得分:7)

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

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

微软有一篇关于所有这些here的好文章。此外,您可以查看像this这样的文章,以了解如何设置它。我们经常遇到这种情况,一开始可能会很痛苦,特别是因为作为开发人员,你可能无法直接控制服务器(尤其是生产服务器)而且你需要花费大量时间服务员们走下大厅。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

您对Web服务器的身份验证不会传递给sql server。 Web服务器使用运行应用程序池的帐户对SQL Server进行身份验证。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

如果没有,那么这可能是因为默认情况下SQL Server安装自己,默认情况下关闭tcp。

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