我有一个小的 ASP.NET 测试脚本,用于打开与域中另一台计算机上的 SQL Server 数据库的连接。但并非在所有情况下都能正常工作。
设置:
W2K8R2 下的 IIS 7.5 尝试连接到远程 SQL Server 2008 R2 实例。所有计算机都位于同一个域中。
使用网站的 ApplicationPoolIdentity 无法连接到 SQL Server,如下所示:
用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。描述:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.Data.SqlClient.SqlException:用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。
但是,如果我将流程模型标识切换为网络服务或我的域帐户,则数据库连接就会成功。
我已在 SQL Server 中授予 \$ 访问权限。
我没有在网站上进行任何类型的身份验证,这只是一个简单的脚本,用于打开与数据库的连接以确保其正常工作。
我已启用匿名身份验证并设置为使用应用程序池标识。
我该如何实现这一点?为什么 ApplicationPoolIdentity 尝试使用匿名登录?更好的是,我该如何让它停止使用匿名登录?
答案1
我也遇到了同样的问题。根据这一页,ApplicationPoolIdentity 应该以机器帐户 (DOMAIN\COMPUTERNAME$) 的身份访问网络资源,但它却使用 NT AUTHORITY\ANONYMOUS LOGON 来访问 SQL 服务器。
我能够使用此修补程序让 ApplicationPoolIdentity 按照文档所述运行。此修补程序未具体描述以 NT AUTHORITY\ANONYMOUS LOGON 形式访问网络资源的解决方案,但它与计算机密码更改有关。
这个 stackoverflow 帖子帮助我找到了这个解决方案:
调试 ASP.NET 身份和 SQL 身份的其他有用技巧
由于 SQL 集成身份验证与线程标识相关,因此能够查看用户标识、线程标识(根据模拟而变化)和 SQL 服务器登录非常有用。此 ASPX 代码片段显示所有这三个:
<%@ Import Namespace="System.Security.Principal" %>
<div>ASP.NET Request User identity: <%= User.Identity.Name %></div>
<div>Current thread/process WindowsIdentity: <%= WindowsIdentity.GetCurrent(false).Name %></div>
<asp:SqlDataSource ID="CurrentUserData" runat="server" ConnectionString="<%$ ConnectionStrings:ConnID %>"
SelectCommand="select SYSTEM_USER" />
<asp:DetailsView DataSourceID="CurrentUserData" runat="server" />
答案2
我遇到了完全相同的问题。我绞尽脑汁了好几个小时,最后重启了机器。问题解决了!请注意,通过 iisreset 重启 IIS 并不能解决问题。只有我重启服务器后问题才解决。