无法使用 Win Auth 从托管在 IIS7 中的 ASP.Net Web 应用程序连接到数据库

无法使用 Win Auth 从托管在 IIS7 中的 ASP.Net Web 应用程序连接到数据库

我有一个在带有 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。存在一些已知的权限提升安全漏洞,授予该帐户权限也会为其他应用程序打开权限。我可能只会创建一个自定义用户,分配给应用程序池,授予磁盘权限,然后授予数据库访问权限。

相关内容