我在 Windows Server 2008 上使用必须访问服务器的 ASP.NET 应用程序运行 SQL Server 2008 Express Edition。ASP.NET 应用程序与在NetworkService
帐户上运行的应用程序池相关联。该帐户又在所需数据库中的 SQL Server 上具有登录和用户记录。当我尝试运行 ASP.NET 网站时,我得到一个空白页面,在错误日志中查看时,我似乎得到了以下信息事件记录:
用户“NT AUTHORITY\NETWORK SERVICE”登录失败。原因:无法打开明确指定的数据库。[客户:myLocalMachine]
连接字符串有Trusted_Connection=True
; 并指定所需的数据库。
当我明确指定用户名和密码时,我收到另一个登录错误,指出密码不正确,即使相同的 un/pw 组合在 SQL Server Management Studio 中有效。该NETWORK SERVICE
帐户似乎拥有数据库所需的所有权限。另外,我做了一个测试 ASP.NET 网站项目,它从该数据库中的表中进行简单的选择,并使用相同的配置文件我没有收到错误,它似乎工作。
是否与信任级别有关,因为原始的 ASP.NET Web 应用程序引用了各种 DLL,包括开源库。此外,应用程序似乎无法写入事件日志本身,从而引发安全异常,即使配置文件中的所有内容(包括 machine.config)都表明应用程序完全信任。
我将使用我在本地计算机上设置并以匿名用户身份放入 IIS 应用程序的显式帐户进行测试。这样您就可以从 SSMS 或 VS 对其进行测试,并确保您可以毫无问题地连接到服务器和数据库。
一旦它起作用了,或者如果它不起作用,您可以在 ASP 端调试它可能失败的位置。SQL 方面很简单,虽然我没有尝试过网络服务帐户。应该没有理由它不起作用,但我还没有看到有人使用它。
就在我的脑海中,web.config 文件中的可能是信任级别问题吗?另外,SQL Server 是 Windows 身份验证模式还是混合身份验证模式?SQL Server 是否为 TCP/IP 配置?我认为在 SQL Server 2008 中 TCP/IP 被禁用并默认使用共享内存或命名管道。
如果数据库实例与 Web 应用程序位于不同的服务器上,那么您需要为 DOMAIN\WEBSERVER$ 添加 SQL 登录名,然后授予其访问正确数据库的权限。
对于 SQL Server 上的安全帐户,“默认数据库”是否设置为适当的数据库,还是仍列为默认“主”数据库?o
我追逐这个错误大约一个小时或更长时间。我尝试了很多东西,包括 Sql Server 配置、添加网络服务用户等。
您需要确保连接字符串中指定的数据库与您授予用户权限的数据库相匹配。
然而,最后我遇到的问题是我的连接字符串中的数据库有一个错字 - al 并且我被转置了,这在我使用的分辨率中很难找到。
所以我的建议是:找到另一个允许您测试连接字符串的应用程序,并测试连接字符串。
不是答案,但可能是一种解决方法,当我从 Web 应用程序连接到 SQL Server 时,我总是使用未集成的 SQL 身份验证。我还使用不同的 SQL 登录来读取数据和写入数据,即当页面必须写入数据时,我使用具有写入权限的帐户,而对于所有其他页面,我使用仅具有读取权限的帐户。这在我看来更安全,因为我可以为不同的应用程序使用不同的登录名,所以我可以跟踪哪个应用程序正在使用数据库。
JR