经典ASP连接远程SQL Server数据库问题

8
我有一个经典的ASP应用程序,我正在尝试连接到不同服务器上的SQL Server 2008数据库。 ASP应用程序正在从Windows Server 2008上的IIS7提供服务。
我已将网站的应用程序池更改为运行在特定的Windows帐户下,并且我已经验证该帐户可以访问远程服务器上的数据库。
然而,当我在浏览器中运行应用程序时,我收到以下错误:
应用程序错误 编号:-2147217843(0x80040E4D) 来源:Microsoft OLE DB提供程序用于SQL Server 说明:用户“NT AUTHORITY \ ANONYMOUS LOGON”的登录失败。
为什么它尝试使用NT AUTHORITY \ ANONYMOUS LOGON连接? 应用程序池标识不适用于经典的ASP代码吗? 我如何使其作为特定用户连接?
编辑
这是我使用的连接字符串:
Provider = SQLOLEDB.1; Data Source = myDbServer; Initial Catalog = myDatabase; Integrated Security = SSPI
3个回答

25

如果一个站点要使用应用程序池标识来运行经典 ASP,您需要更改用于匿名身份验证的凭据。默认情况下,该站点将被设置为使用特定用户,即 IUSR。

从您的站点的 IIS 区域中选择身份验证,然后选择匿名身份验证,接着选择编辑。从特定用户更改为应用程序池标识

建议使用Windows身份验证(集成安全性)而不是SQL身份验证,这样您就不必在配置文件中存储凭据,以便如果这些文件被攻击者入侵,您不会失去对凭据的控制。


这个问题困扰了我好几天了,谢谢你发布了一个解决方案。 - Tony
@RonnieOverby 这应该是被接受的答案!+1 - user692942

0

两个服务器都不是Active Directory域的成员。 - Ronnie Overby
集成安全性=SSPI需要NTLM/Kerberos才能正常工作。您可以创建一个域并使用真实的Windows身份验证,或者改用SQL身份验证,或者在两台计算机上创建相同的本地用户/密码帐户,并让应用程序池使用此凭据。 - Remus Rusanu
@Remus - "...或者在两台机器上创建相同的本地用户/密码帐户,并让应用程序池使用此凭据。" 这正是我所做的,但它没有起作用。我已经为一个使用相同帐户的ASP.NET站点完成了这个操作。这真令人沮丧。 - Ronnie Overby
我认为您的经典ASP应用程序池并没有以您期望的用户身份运行。但是,我对IIS7上的经典ASP不够熟悉,无法猜测原因。 - Remus Rusanu

-1

你应该为连接字符串www.connectionstrings.com指定用户名和密码,或将IIS应用程序设置为以特定用户身份运行,但这样会使IIS中的许多安全设置变得过时。

Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername; Pwd=myPassword;

请看这里:aspfaq

最后,请确保在IIS站点上禁用匿名访问,以便实际模拟您选择的用户,而不是通过匿名令牌传递。


我不想禁用匿名访问。我正在使用表单来验证用户。 - Ronnie Overby
6
如果可以的话,尽量不要指定用户名和密码(即SQL身份验证)。使用Windows身份验证(集成安全性)意味着您不需要在配置文件中放置凭据,因此如果这些文件被攻击,则不会失去对凭据的控制。我已经添加了一个答案,展示了如何在经典ASP中启用Windows身份验证。 - Robin Minto
@RonnieOverby 这不应该是被接受的答案!请参见 @RobinM 的回答 - user692942
如果不再需要,我可以删除这个。 - Mauro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接