我有一个在 Windows Intranet 环境中运行的 ASP.net 应用程序。我需要以当前登录用户的身份执行某些数据库更新。
IIS/服务器信息:
- IIS 版本 10
- 视窗服务器 2019
- ASP.net 网络表单应用程序
- .NET 4.7
- 启用Windows 身份验证
- 模拟和匿名身份验证已禁用
- 应用程序池使用集成管道
- 应用程序池以其身份使用域服务帐户运行,该帐户有权根据需要访问其他资源。
其他详情:
- 我所有的数据库连接字符串都设置为Integrated security=true
- 在活动目录中,已配置 Web 服务器和 SQL 服务器之间的约束委派,允许MSSQLSvc : 1433和MSSQLSvc(无端口)
- 域服务帐户是 Web 服务器上本地管理员组的成员(仅用于测试目的)
当我执行需要以当前登录用户身份完成的数据库更新时,我以这种方式模拟它们:
var windowsIdentity = User.Identity as WindowsIdentity;
WindowsIdentity.RunImpersonated(windowsIdentity.AccessToken, () =>
{
// perform database update
});
这会引发异常 -
System.Data.SqlClient.SqlException: Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
如果我将应用程序池标识更改为使用AppPoolIdentity (默认应用程序池标识),则模拟工作正常。
为什么这种模拟适用于AppPoolIdentity,但不适用于我的域服务帐户?