【发布时间】:2020-01-09 14:54:13
【问题描述】:
我有一个在 Windows Intranet 环境中运行的 ASP.net 应用程序。我需要以当前登录用户的身份执行某些数据库更新。
IIS/服务器信息:
- IIS 版本 10
- Windows 服务器 2019
- ASP.net 网络表单应用程序
- .NET 4.7
- Windows 身份验证 已启用
- 模拟和匿名身份验证已禁用
- 应用程序池使用集成管道
- 应用程序池使用 域服务帐户 作为其身份运行,该身份有权根据需要访问其他资源。
其他细节:
- 我的所有数据库连接字符串都设置为 integrated security=true
- 在活动目录中,已配置 Web 服务器和 SQL 服务器之间的约束委派,允许 MSSQLSvc : 1433 和 MSSQLSvc(无端口)
- 域服务帐户是网络服务器上本地管理员组的成员(仅用于测试目的)
当我以当前登录用户的身份执行需要完成的数据库更新时,我以这种方式模拟它们:
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,但不适用于我的域服务帐户?
【问题讨论】:
标签: c# asp.net iis impersonation kerberos-delegation