【问题标题】:Classic ASP Impersonation problem on IIS7 Windows 2008 serverIIS7 Windows 2008 服务器上的经典 ASP 模拟问题
【发布时间】:2026-02-18 22:50:02
【问题描述】:

我正在尝试从在 IIS7 (webadmin) 上的 Windows 2008 serer 上运行的经典 asp 站点写入服务器 (web05) 上的文件。这将失败,并且 web05 在保存操作过程中记录匿名登录尝试。

Webadmin 的站点以经典模式在应用程序池上运行,域用户作为进程帐户。进程帐户有权“信任此用户以委托任何服务(仅限 Kerberos)”。这同样适用于 web05 和 webadmin 服务器。

该站点使用 Windows 身份验证,其想法是,当我使用域用户登录该站点时,我的用户的权限应定义允许我在 IIS 站点上下文中执行的操作。如果我打开基本身份验证,一切正常。

我还使用 setspn.exe 为 URL 添加了 SPN。如果我输入 setspn.exe -L webadmin,我会得到:

HTTP/webadmin.companyname.com
TERMSRV/webadmin
TERMSRV/webadmin.companypub.local
HOST/webadmin
HOST/webadmin.companypub.local

据我了解,SPN 设置正确。

如果我在执行保存操作时在 webadmin 上运行 processmonitor,它表示该进程确实在冒充我的域用户 - 但得到“拒绝访问”(正如我之前所说,web05 记录了一次匿名登录尝试)。

知道是什么原因造成的吗?

亲切的问候, 西蒙

【问题讨论】:

    标签: iis-7 asp-classic impersonation kerberos


    【解决方案1】:

    在我看来,您对冒充有点困惑。该过程不会模拟域用户帐户,它只是以该用户身份运行。有区别。

    当请求到达 ASP 时,它将模拟用户,处理请求的线程将在模拟用户的安全令牌下运行。很有可能让相同的进程在多个线程中模拟多个不同的用户。在启用匿名用户访问的大多数情况下,此用户是访客级别 IUSR 帐户。它很可能是在此用户下您的代码正在尝试运行但未能运行。

    但是,如果为正在访问的资源关闭了匿名或 IUSR 帐户无权访问该资源,则会发回 401 响应,并指出它将接受哪些身份验证协议。然后,浏览器可能会尝试使用当前用户的凭据对连接进行身份验证,或者向用户请求一些凭据。

    您没有具体说明您尝试保存文件的方式。不过,有几点值得指出。

    1. 随后可能导致访问被拒绝的 ASP 代码执行将不会使用上述机制来尝试解析用户。
    2. 连接经过身份验证后,通常会继续将其重新用于后续请求(这与 HTTP 是“无连接”协议的知识相悖)。

    【讨论】:

    • 你对我对冒充感到困惑是完全正确的。因此,如果我回到开始并问自己我要做什么:我希望我的域用户经过身份验证,这样我就可以让他的经典 ASP 站点使用我的域用户凭据写入另一台服务器上的文件。我使用 Windows 身份验证的方式是否正确?未启用匿名身份验证。我正在尝试从 ADODB 流对象中保存文件。 FileSytemObject 也失败了。
    • 是的,如果您希望在客户端用户身份下完成的活动关闭匿名访问,至少对于包含您的代码的页面,并打开 Windows 集成安全性,您是在正确的轨道上。假设用户拥有正确的权限,代码应该可以工作。
    • 那很好。但是,我已经关闭了匿名访问并打开了 Windows 身份验证。我能够在站点上使用我的域用户登录 - 用户甚至验证了数据库访问(具有 Windows 身份验证的系统 dsn),但即使登录的用户具有适当的权限,我也无法在远程服务器上保存文件权利。
    【解决方案2】:

    我正在尝试清理我以前的问题。这个答案不足以回答上述问题,但我得出的结论是,提供一些见解总比没有好。如果 op 不同意,请采取必要的措施。

    这是一种回归方式——但我记得我想在这个应用程序上运行 kerberos 身份验证。问题原来是我试图在防火墙外做kerberos。该应用程序可以在服务器主域的域和防火墙内正常工作,但每当请求来自外部时就会失败。

    我和微软的一位爱尔兰技术人员聊了很多,他教了我一些关于使用 Kerberos 的限制。我想使用 Kerberos 的原因是我不喜欢基本 Windows 身份验证未加密的想法。

    祝你的 Kerberos 任务好运 :-)

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,结果证明这是对应用程序池的简单更改。如果启用 32 位应用程序设置为 FALSE,那么我会收到登录机器的提示。将此值设置为 true 可解决此问题。

      【讨论】:

      • 有趣。希望我能测试一下。当我与 MS 技术人员一起解决问题时,他耐心地向我解释了我的任务如何无法工作,因为 kerberos 在域外无法工作。显然我的知识太薄弱,无法在这里代表任何权威,所以任何意见都是有价值的。