我有一个在带有 IIS 7 和 SQL Server 2008 的 Windows Server 2008 64 位上托管的 Web 应用程序。Web 应用程序池帐户是网络服务,我已将此帐户添加到 SQL Server 2008 登录名并映射到具有 dbowner 权限的数据库中的用户。
该网站采用 ASP.Net 2.0,并使用表单身份验证来保护对部分资源(并非全部)的访问,因此在 IIS 7 中启用了匿名访问、Imersonation=True 和表单身份验证。Web 应用程序正在使用成员资格提供程序控件。
当网站启动时,在“应用程序启动”中,它会尝试连接数据库并读取一些启动配置。数据库的连接字符串保存在 web.config 中。以下是连接字符串。
Data Source=XXXXX; Initial Catalog=XXXXX; Integrated Security=SSPI; Trusted_Connection=True;
但是,当应用程序启动时,它无法连接到数据库,并且我在事件日志中发现了以下 3 个条目。
建立具有集成安全性的连接时,SSPI 握手失败,错误代码为 0x8009030c;该连接已关闭。[客户端:]
登录失败。登录来自不受信任的域,无法与 Windows 身份验证一起使用。[客户端:]
Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 4/26/2011 9:22:05 PM
Event time (UTC): 4/26/2011 6:22:05 PM
Event ID: 71a4b2cd8d40492ab89af3430cf42ea5
Event sequence: 2
Event occurrence: 1
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/5/ROOT-1-129483157247676684
Trust level: Full
Application Virtual Path: /
Application Path: C:\LMS Projects\Deployment\Web Applications\Microsoft Dynamics CRM Customer LMS Portal\
Machine name: LMS
Process information:
Process ID: 3688
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: LoyaltyException
Exception message: Exception of type 'LMS.Helpers.LoyaltyException' was thrown.
Request information:
Request URL: http://localhost:6666/default.aspx
Request path: /default.aspx
User host address: ::1
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\NETWORK SERVICE
Thread information:
Thread ID: 4
Thread account name: NT AUTHORITY\NETWORK SERVICE
Is impersonating: False
Stack trace: at ASP.global_asax.Application_Start() in c:\LMS Projects\Deployment\Web Applications\Microsoft Dynamics CRM Customer LMS Portal\Global.asax:line 27
上面显示的异常是我在处理平台异常后抛出的自定义异常,因此不要与代码中的错误混淆。此代码在 Windows Server 2003 和 IIS 6.0 环境中运行良好。
答案1
模拟将导致使用您的匿名用户,而不是您的应用程序池用户。
以下是一些建议:
- 如果您为每个站点提供自己的应用程序池,则请为匿名用户将其设置为使用应用程序池用户。这样,您只需要维护一个用户。
- 将应用程序池用户设置为网络服务以外的用户。由于您使用的是 IIS 7.0 (WS08 RTM),因此使用 IIS APPPOOL\AppPoolName 用户会更加困难,并且通常不适合直接使用 NETWORK SERVICE。存在一些已知的权限提升安全漏洞,授予该帐户权限也会为其他应用程序打开权限。我可能只会创建一个自定义用户,分配给应用程序池,授予磁盘权限,然后授予数据库访问权限。