1

我有一个在 Windows Intranet 环境中运行的 ASP.net 应用程序。我需要以当前登录用户的身份执行某些数据库更新。

IIS/服务器信息:

  • IIS 版本 10
  • 视窗服务器 2019
  • ASP.net 网络表单应用程序
  • .NET 4.7
  • 启用Windows 身份验证
  • 模拟匿名身份验证已禁用
  • 应用程序池使用集成管道
  • 应用程序池以其身份使用域服务帐户运行,该帐户有权根据需要访问其他资源。

其他详情:

  • 我所有的数据库连接字符串都设置为Integrated security=true
  • 在活动目录中,已配置 Web 服务器和 SQL 服务器之间的约束委派,允许MSSQLSvc : 1433MSSQLSvc(无端口)
  • 域服务帐户是 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,但不适用于我的域服务帐户

4

1 回答 1

0

我以前也遇到过类似的问题,我看到你正在使用 Kerberos,一旦你得到它就可以了!

在与您类似的情况下,对我有用的方法是打开 IIS,转到您的站点,单击配置编辑器图标。在顶部两个标题中,首先单击“发件人”下拉菜单并选择“ApplicationHost.config”,然后在“发件人”左侧的“部分”标题中,单击下拉菜单,然后展开文件夹:

system.WebServer->security->authentication->windowsAuthentication,

根据您的情况,您可以从此处的选项中选择“useAppPoolCredentials”并将其设置为 TRUE。

在此处输入图像描述

当您将“useAppPoolCredentials”设置为 true 时,您告诉 IIS 它需要使用其应用程序池标识,您将其定义为域服务帐户来解密返回的授权票证。用户配置文件通常没有执行此操作的规定。

如果这不起作用,要尝试的另一件事是在应用程序池的高级设置中切换“加载用户配置文件”设置,我不确定 True 或 False 是否会解决您的问题,但它似乎有助于之前的类似问题。我会先尝试上述方法,如果这不起作用,请尝试以下操作:

加载用户配置文件

我没有看到任何关于 SPN 的提及,你在使用那些吗?将域帐户作为应用程序池 ID 运行时可能需要它们。下面的文章记录了该步骤以及其他许多使其工作的步骤:

https://techcommunity.microsoft.com/t5/iis-support-blog/setting-up-kerberos-authentication-for-a-website-in-iis/ba-p/324644

此外,这里有一些文章极大地帮助了我在工作中完成这一切。

https://docs.microsoft.com/en-us/archive/blogs/chiranth/setting-up-kerberos-authentication-for-a-website-in-iis

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc961723(v=technet.10)?redirectedfrom=MSDN

希望这可以帮助。

更新:对于那些仍在寻求帮助解决此问题的人,我们为我们的系统找到了一种不需要模拟/委托的解决方法:

相反,我们创建了另一个 API 端点,一个“中点”,它接收来自初始端点的请求,无需模拟。在这种情况下,我们能够创建一个中间 Sys 帐户作为中间点的应用程序池 ID 运行,然后该 ID 用于查询数据库,这是 sys 帐户具有的唯一访问权限,这足以保证安全团队可以接受。我们意识到,根据我们的协议,当我们使用特殊特权系统帐户时,不需要记录拨打电话的个人。

于 2020-01-09T21:37:26.167 回答